有没有办法在CMake中将字符串(ASCII)转换为十六进制

时间:2019-09-18 10:07:56

标签: string cmake hex ascii data-conversion

是否可以在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”的函数,该函数比较"a-z, A-Z, 0-9"的char输入并根据AsciiTable返回其十六进制,但是我正在寻找一个更智能/更短的解决方案。 / p>

2 个答案:

答案 0 :(得分:1)

我不知道对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

答案 1 :(得分:0)

我最终根据@squareskittles响应创建了此功能:

Activity

使用此函数将字符串十六进制转换为C字节数组,如下所示:

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()

输出消息:

STRING_HEX_KEY_TO_C_BYTE_ARRAY("FFFF020200000030" "DEVICE_EUI")