string - 有没有办法在 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 输入并返回其十六进制,但我正在寻找更智能/更短的解决方案。
解决方案
编辑:从 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
推荐阅读
- logging - 在我的 IDE 中运行 Presto 时如何获取堆栈日志?
- c# - 如何从已经与机器人交互的用户的“列表聊天”图形 API 获取团队唯一 ID
- c++ - 用相同的参数声明两个构造函数的最典型的方式是什么?
- python-3.x - centos7 pyodbc安装问题
- r - TraMineR,如何检索聚类分数
- javascript - 使用 Promise.all 时出错:TypeError:中间值不可迭代
- ajax - 如何让我的 ajax 使用我的数量?
- flask - 使用烧瓶执行器同时搜索 2 个表
- javascript - 如何在javascript上导入和导出异步函数?
- java - 如何乘以用户输入的数组?