有没有办法在CMake中将字符串(ASCII)转换为十六进制
Is there a way to convert a string (ASCII) to Hex in CMake
有没有办法在 CMake 中将字符串 (ASCII "a-z, A-Z, 0-9"
) 转换为十六进制?
例如(ASCII to hex):
"HELLO" --> 0x48 0x45 0x4C 0x4C 0x4F
应该是下面命令的相反操作(see here):
string(ASCII <number> \[<number> ...\] <output variable>)
我尝试了一些 CMake math 操作,但它似乎对字符串不起作用。
我可以实现一个带有大 "if" 的函数,根据 AsciiTable 比较 "a-z, A-Z, 0-9"
和 returns 的字符输入及其十六进制,但我正在寻找smarter/shorter 解决方案。
EDIT:从 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()
commands to write the ASCII to a file, then read it as hex. With some additional formatting using string(REGEX MATCHALL ...)
and 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 }
有没有办法在 CMake 中将字符串 (ASCII "a-z, A-Z, 0-9"
) 转换为十六进制?
例如(ASCII to hex):
"HELLO" --> 0x48 0x45 0x4C 0x4C 0x4F
应该是下面命令的相反操作(see here):
string(ASCII <number> \[<number> ...\] <output variable>)
我尝试了一些 CMake math 操作,但它似乎对字符串不起作用。
我可以实现一个带有大 "if" 的函数,根据 AsciiTable 比较 "a-z, A-Z, 0-9"
和 returns 的字符输入及其十六进制,但我正在寻找smarter/shorter 解决方案。
EDIT:从 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()
commands to write the ASCII to a file, then read it as hex. With some additional formatting using string(REGEX MATCHALL ...)
and 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 }