首页 > 解决方案 > 有没有办法在 CMake 中将字符串(ASCII)转换为十六进制

问题描述

有没有办法"a-z, A-Z, 0-9"在 CMake 中将字符串(ASCII)转换为十六进制?

例如(ASCII 到十六进制):

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

应该是以下命令的相反操作(见这里):

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

我尝试了一些 CMake数学运算,但它似乎不适用于字符串。

我可以实现一个带有大“if”的函数,该函数"a-z, A-Z, 0-9"根据AsciiTable比较 char 输入并返回其十六进制,但我正在寻找更智能/更短的解决方案。

标签: stringcmakehexasciidata-conversion

解决方案


编辑:从 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 ...)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

推荐阅读