You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:35:21