簡體   English   中英

有沒有辦法在 CMake 中將字符串(ASCII)轉換為十六進制

[英]Is there a way to convert a string (ASCII) to Hex in CMake

有沒有辦法在 CMake 中將字符串(ASCII "az, AZ, 0-9" )轉換為十六進制?

例如( ASCII 到 hex ):

"HELLO" --> 0x48 0x45 0x4C 0x4C 0x4F

應該是以下命令的相反操作( 見這里):

string(ASCII <number> \[<number> ...\] <output variable>)

我嘗試了一些 CMake數學運算,但它似乎不適用於字符串。

我可以實現一個帶有大“if”的函數,該函數比較"az, AZ, 0-9"的字符輸入並根據AsciiTable返回其十六進制,但我正在尋找更智能/更短的解決方案。

編輯:從 CMake 3.18 開始,現在存在string(ASCII ...)的逆運算。 使用string(HEX ...)

set(TEST_STRING "HELLO")
# Convert the string to hex.
string(HEX ${TEST_STRING} HEX_STRING)
message(${HEX_STRING})

這將打印以下內容:

48454c4c4f

因此您必須手動添加0x前綴(在下面適用於早期 CMake 版本的響應中進行了描述)。


對於 CMake 3.17 及更早版本,我不知道對 CMake 原生的 ASCII 到十六進制轉換的任何支持(即string(ASCII ... )的逆運算不存在)。 一種解決方法是利用 CMake 的file()命令將 ASCII 寫入文件,然后將其讀取為十六進制。 使用string(REGEX MATCHALL ...)list(JOIN ...)一些額外的格式化,我們可以獲得代表 ASCII 輸入的十六進制值字符串:

set(TEST_STRING "HELLO")

# Write the ASCII file, then read it as hex.
file(WRITE ${CMAKE_BINARY_DIR}/asciiToHexFile.txt "${TEST_STRING}")
file(READ ${CMAKE_BINARY_DIR}/asciiToHexFile.txt HEX_CONTENTS HEX)
message("HEX_CONTENTS: ${HEX_CONTENTS}")

# Separate into individual bytes.
string(REGEX MATCHALL "([A-Za-z0-9][A-Za-z0-9])" SEPARATED_HEX "${HEX_CONTENTS}")
message("SEPARATED_HEX: ${SEPARATED_HEX}")

# Append the "0x" to each byte.
list(JOIN SEPARATED_HEX " 0x" FORMATTED_HEX)

# JOIN misses the first byte's "0x", so add it here.
string(PREPEND FORMATTED_HEX "0x")
message("FORMATTED_HEX: ${FORMATTED_HEX}")

使用輸入HELLO ,輸出打印以下內容:

HEX_CONTENTS: 48454c4c4f
SEPARATED_HEX: 48;45;4c;4c;4f
FORMATTED_HEX: 0x48 0x45 0x4c 0x4c 0x4f

我最終根據@squareskittles 響應創建了這個函數:

function(STRING_HEX_KEY_TO_C_BYTE_ARRAY STRING_HEX VARIABLE_NAME)
    # Separate into individual bytes.
    string(REGEX MATCHALL "([A-Fa-f0-9][A-Fa-f0-9])" SEPARATED_HEX ${STRING_HEX})

    # Append the "0x" to each byte.
    list(JOIN SEPARATED_HEX ", 0x" FORMATTED_HEX)

    # Prepend "{ 0x"
    string(PREPEND FORMATTED_HEX "{ 0x")

    # Append " }"
    string(APPEND FORMATTED_HEX " }")

    set(${VARIABLE_NAME} ${FORMATTED_HEX} PARENT_SCOPE)
    message(${VARIABLE_NAME}=${FORMATTED_HEX})
endfunction()

使用此函數將字符串十六進制轉換為 C 字節數組,如下所示:

STRING_HEX_KEY_TO_C_BYTE_ARRAY("FFFF020200000030" "DEVICE_EUI")

輸出消息:

DEVICE_EUI={ 0xFF, 0xFF, 0x02, 0x02, 0x00, 0x00, 0x00, 0x30 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM