Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在cmake中从十进制转换为十六进制_Cmake - Fatal编程技术网

在cmake中从十进制转换为十六进制

在cmake中从十进制转换为十六进制,cmake,Cmake,Y: 在CMake中,是否可以将16进制的变量a转换为10十六进制,反之亦然 谷歌搜索只让我想到以下几点: 它不做转换 X: 我正在尝试使用“配置文件”,以十进制形式读取配置的值,并在配置的头文件中以十六进制形式输出它。我使用了自己的,但感觉它应该是内置的 cmake_minimum_required (VERSION 2.6.4) macro(HEXCHAR2DEC VAR VAL) if (${VAL} MATCHES "[0-9]")

Y: 在CMake中,是否可以将16进制的变量a转换为10十六进制,反之亦然

谷歌搜索只让我想到以下几点:

它不做转换

X:
我正在尝试使用“配置文件”,以十进制形式读取配置的值,并在配置的头文件中以十六进制形式输出它。

我使用了自己的,但感觉它应该是内置的

    cmake_minimum_required (VERSION 2.6.4)

    macro(HEXCHAR2DEC VAR VAL)
        if (${VAL} MATCHES "[0-9]")
            SET(${VAR} ${VAL})
        elseif(${VAL} MATCHES "[aA]")
            SET(${VAR} 10)
        elseif(${VAL} MATCHES "[bB]")
            SET(${VAR} 11)
        elseif(${VAL} MATCHES "[cC]")
            SET(${VAR} 12)
        elseif(${VAL} MATCHES "[dD]")
            SET(${VAR} 13)
        elseif(${VAL} MATCHES "[eE]")
            SET(${VAR} 14)
        elseif(${VAL} MATCHES "[fF]")
            SET(${VAR} 15)
        else()
            MESSAGE(FATAL_ERROR "Invalid format for hexidecimal character")
        endif()

    endmacro(HEXCHAR2DEC)

    macro(HEX2DEC VAR VAL)

        IF (${VAL} EQUAL 0)
            SET(${VAR} 0)
        ELSE()

            SET(CURINDEX 0)
            STRING(LENGTH "${VAL}" CURLENGTH)

            SET(${VAR} 0)

            while (CURINDEX LESS  CURLENGTH)

                STRING(SUBSTRING "${VAL}" ${CURINDEX} 1 CHAR)

                HEXCHAR2DEC(CHAR ${CHAR})

                MATH(EXPR POWAH "(1<<((${CURLENGTH}-${CURINDEX}-1)*4))")
                MATH(EXPR CHAR "(${CHAR}*${POWAH})")
                MATH(EXPR ${VAR} "${${VAR}}+${CHAR}")
                MATH(EXPR CURINDEX "${CURINDEX}+1")
            endwhile()
        ENDIF()

    endmacro(HEX2DEC)

    macro(DECCHAR2HEX VAR VAL)

        if (${VAL} LESS 10)
            SET(${VAR} ${VAL})
        elseif(${VAL} EQUAL 10)
            SET(${VAR} "A")
        elseif(${VAL} EQUAL 11)
            SET(${VAR} "B")
        elseif(${VAL} EQUAL 12)
            SET(${VAR} "C")
        elseif(${VAL} EQUAL 13)
            SET(${VAR} "D")
        elseif(${VAL} EQUAL 14)
            SET(${VAR} "E")
        elseif(${VAL} EQUAL 15)
            SET(${VAR} "F")
        else()
            MESSAGE(FATAL_ERROR "Invalid format for hexidecimal character")
        endif()
    endmacro(DECCHAR2HEX)

    macro(DEC2HEX VAR VAL)
        if (${VAL} EQUAL 0)
            SET(${VAR} 0)
        ELSE()
            SET(VAL2 ${VAL})
            SET(${VAR} "")

            WHILE (${VAL2} GREATER 0)
                MATH(EXPR VALCHAR "(${VAL2}&15)")
                DECCHAR2HEX(VALCHAR ${VALCHAR})
                SET(${VAR} "${VALCHAR}${${VAR}}")
                MATH(EXPR VAL2 "${VAL2} >> 4")
            ENDWHILE()
        ENDIF()
    endmacro(DEC2HEX)
cmake_最低要求(2.6.4版)
宏(HEXCHAR2DEC VAR VAL)
如果(${VAL}匹配“[0-9]”)
集合(${VAR}${VAL})
elseif(${VAL}匹配“[aA]”)
集合(${VAR}10)
elseif(${VAL}匹配“[bB]”)
集合(${VAR}11)
elseif(${VAL}匹配“[cC]”)
集合(${VAR}12)
elseif(${VAL}匹配“[dD]”)
集合(${VAR}13)
elseif(${VAL}匹配“[eE]”)
集合(${VAR}14)
elseif(${VAL}匹配“[fF]”)
集合(${VAR}15)
else()
消息(致命错误“十六进制字符格式无效”)
endif()
endmacro(HEXCHAR2DEC)
宏(HEX2DEC VAR VAL)
如果(${VAL}等于0)
集合(${VAR}0)
ELSE()
集合(库林指数0)
字符串(长度“${VAL}”CURLENGTH)
集合(${VAR}0)
而(CURINDEX减去卷曲长度)
字符串(子字符串“${VAL}”${CURINDEX}1个字符)
HEXCHAR2DEC(CHAR${CHAR})
数学(EXPR POWAH)(14)
(完)
ENDIF()
endmacro(DEC2HEX)

使用一些技巧,您可以非常简单地完成此操作。CMake的表达式在内部使用
int
,因此它最多只能工作231-1位。类似这样的内容(您可能希望将其更改为big-endian或其他形式)


回答得很好,谢谢!不过我认为结尾的正则表达式替换是错误的,因为它会反转相邻字符,而不是反转整个字符串。我通过将字符串转换为带有正则表达式匹配符“(.)”的列表,然后反转列表,然后构建一个新字符串来解决这个问题。您可能还希望通过添加if避免前导零(${number}等于0)break()endif()到loop@SamuelPeter:具体取决于您想要什么,我猜。这是一个小的endian int的字节十六进制表示,例如258->0201。如果您只想要一个“普通”十六进制数(不确定为什么)只在循环中预加十六进制数字更容易,然后你甚至不需要正则表达式。例如,
set(hex“${nibble\u hex}${hex}”)
。哦,是的,那更好,谢谢!是的,我需要操作我们在版本号中使用的普通十六进制数。你不需要使用小的尾数字节定义常量;)您通常不会在版本号中使用十六进制,tbf!最好提供一个这些函数的使用示例
function (NumberToHex number output)
    set (chars "0123456789abcdef")
    set (hex "")

    foreach (i RANGE 7)
        math (EXPR nibble "${number} & 15")
        string (SUBSTRING "${chars}" "${nibble}" 1 nibble_hex)
        string (APPEND hex "${nibble_hex}")

        math (EXPR number "${number} >> 4")
    endforeach ()

    string (REGEX REPLACE "(.)(.)" "\\2\\1" hex "${hex}")
    set ("${output}" "${hex}" PARENT_SCOPE)
endfunction ()