【问题标题】:Is there a way to convert a string (ASCII) to Hex in CMake有没有办法在 CMake 中将字符串(ASCII)转换为十六进制
【发布时间】:2020-01-19 06:16:51
【问题描述】:

有没有办法在 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" 的字符输入并根据AsciiTable 返回其十六进制,但我正在寻找更智能/更短的解决方案。

【问题讨论】:

    标签: string cmake hex ascii data-conversion


    【解决方案1】:

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

    【讨论】:

    • 可能是您想将正则表达式更新为 ([A-Fa-f0-9][A-Fa-f0-9]) 十六进制数字为 0..9 和 A..F
    【解决方案2】:

    我最终根据@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 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-11
      • 2014-11-16
      • 2011-06-14
      • 2011-11-21
      • 2022-01-11
      • 2018-05-26
      相关资源
      最近更新 更多