如何将机器码二进制序列写入生成可执行文件?代码疑问
问题解答
现有代码无法生成可执行机器码文件,原因如下:
- 文件打开模式错误:用
"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比特序列打包成字节,再以二进制模式写入文件:
- 把每8个连续的0/1比特组合成一个字节(注意比特的顺序,通常是高位在前);
- 用
unsigned char数组存储这些打包后的字节(unsigned char保证是1字节大小,避免平台差异); - 用
"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,提问作者Владислав Король
相关产品推荐
相关产品推荐

