CMake中是否有原生方法将整数以字节形式写入文件?
CMake原生写入整数为二进制字节的解决方案
CMake本身没有原生的file()命令选项支持直接将整数以固定字节数的二进制形式写入文件——默认file(WRITE)只会输出字符串格式的数值。不过你可以通过自定义CMake函数,结合数学运算和字符串转义来实现需求。
实现思路
通过将整数拆分为单个字节,把每个字节转换为\xXX格式的转义字符串,再用file(WRITE)写入文件——CMake会自动将这类转义序列解析为对应的二进制字节。
示例代码
下面是一个通用的自定义函数,支持指定字节数(如4字节)和字节序(大端/小端):
# 自定义函数:将整数以指定字节数和字节序的二进制形式写入文件 # 参数: # filename: 输出文件路径 # int_value: 要写入的整数值 # byte_count: 固定字节数(如4) # endianness: 字节序,可选"big"或"little" function(write_int_as_binary filename int_value byte_count endianness) set(binary_str "") if(${endianness} STREQUAL "big") # 大端模式:从高位到低位拆分字节 math(EXPR shift_step "8 * (${byte_count} - 1)") foreach(i RANGE 0 ${byte_count}-1) math(EXPR byte "(${int_value} >> ${shift_step}) & 0xFF") string(PRINTF "\\x%02X" ${byte} hex_byte) string(APPEND binary_str "${hex_byte}") math(EXPR shift_step "${shift_step} - 8") endforeach() elseif(${endianness} STREQUAL "little") # 小端模式:从低位到高位拆分字节 foreach(i RANGE 0 ${byte_count}-1) math(EXPR byte "(${int_value} >> ${i}*8) & 0xFF") string(PRINTF "\\x%02X" ${byte} hex_byte) string(APPEND binary_str "${hex_byte}") endforeach() else() message(FATAL_ERROR "Unsupported endianness: ${endianness}, must be 'big' or 'little'") endif() # 写入二进制字节 file(WRITE ${filename} "${binary_str}") endfunction() # 你的业务逻辑:获取文件大小并写入 file(SIZE generated_file.txt file_size) # 将file_size以4字节大端形式写入output.txt write_int_as_binary(output.txt ${file_size} 4 big)
效果说明
对于file_size=465435(十六进制0x071A1B),上述代码会向output.txt写入4字节的二进制序列:\x00\x07\x1A\x1B,完全符合你的需求。
注意事项
- 确保输入的整数值不超过指定字节数的范围(比如4字节无符号整数最大为
4294967295),超出部分会被截断。 - 该方案纯CMake实现,不依赖外部工具,跨平台兼容性良好。
内容的提问来源于stack exchange,提问作者Matt Stokes
相关产品推荐
相关产品推荐

