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

如何将机器码二进制序列写入生成可执行文件?代码疑问

问题解答

现有代码无法生成可执行机器码文件,原因如下:

  • 文件打开模式错误:用"w"打开文件是文本模式,在Windows等系统中,文本模式会自动转换换行符(比如将0x0A替换为0x0D0A),直接破坏二进制机器码的完整性。必须使用"wb"以二进制模式打开文件。
  • 存储格式错误:binaryBuffer是int数组,每个元素单独存储一个0或1,这完全不符合机器码的存储逻辑。机器码是按**字节(8个比特)**为单位的二进制流,比如0b10001101这个机器码片段,应该被存储为一个值为0x8D的单字节(unsigned char类型),而非8个int分别存储1、0、0、0、1、1、0、1。
  • fwrite参数错误:当前代码fwrite(binaryBuffer, 1, 1, result)仅写入了1个字节的数据,且由于binaryBuffer是int数组,写入的内容是第一个int的低字节(比如如果第一个元素是0,写入的就是0x00),这和你需要的机器码字节流完全无关。

正确的处理方式

不需要将机器码存储为长整数,核心是把你的0/1比特序列打包成字节,再以二进制模式写入文件:

  1. 把每8个连续的0/1比特组合成一个字节(注意比特的顺序,通常是高位在前);
  2. 用unsigned char数组存储这些打包后的字节(unsigned char保证是1字节大小,避免平台差异);
  3. 用"wb"模式打开文件,调用fwrite写入整个字节数组。

示例代码

// 示例:假设已经有按顺序排列的比特序列
int machineBits[16] = {1,0,0,0,1,1,0,1, 0,0,0,1,0,0,0,0};
unsigned char machineBytes[2];

// 将每8个比特打包为一个字节(高位在前)
machineBytes[0] = (machineBits[0] << 7) | (machineBits[1] << 6) | 
                  (machineBits[2] << 5) | (machineBits[3] << 4) |
                  (machineBits[4] << 3) | (machineBits[5] << 2) | 
                  (machineBits[6] << 1) | machineBits[7];

machineBytes[1] = (machineBits[8] << 7) | (machineBits[9] << 6) | 
                  (machineBits[10] << 5) | (machineBits[11] << 4) |
                  (machineBits[12] << 3) | (machineBits[13] << 2) | 
                  (machineBits[14] << 1) | machineBits[15];

// 以二进制模式打开文件
FILE* result = fopen("result", "wb");
if (!result) {
    // 处理文件打开失败的逻辑,比如打印错误
    return 1;
}

// 写入打包后的机器码字节
fwrite(machineBytes, sizeof(unsigned char), 2, result);
fclose(result);

额外注意事项

即使你正确写入了机器码字节,生成的文件在现代操作系统(Linux、Windows、macOS)中也不一定能直接执行——因为这些系统的可执行文件需要符合特定格式(ELF、PE、Mach-O),包含文件头、段表、入口点等元数据。只有在裸机、实模式DOS等简单环境下,单纯的机器码字节流才能直接运行。如果要生成现代系统的可执行文件,你还需要实现对应格式的文件结构生成逻辑。

内容的提问来源于stack exchange,提问作者Владислав Король

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:10:53