在cmake中从十进制转换为十六进制
Y: 在CMake中,是否可以将16进制的变量a转换为10十六进制,反之亦然 谷歌搜索只让我想到以下几点: 它不做转换 X:在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]")
我正在尝试使用“配置文件”,以十进制形式读取配置的值,并在配置的头文件中以十六进制形式输出它。我使用了自己的,但感觉它应该是内置的
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 ()