PHP中fclose向文件末尾写入0x31/0x30/0x33字节问题求助
问题原因分析及解决方案
看起来你遇到的这个额外字节问题,大概率是PHP脚本的输出被意外重定向到目标文件导致的,而非fclose()本身的问题。
具体来说:
- 你的PHP代码里可能存在类似
echo fwrite($fp, $binary_data);的写法——fwrite()会返回成功写入的字节数,如果这个数字刚好是103,那echo就会输出字符串"103",对应的十六进制就是0x31 0x30 0x33。 - 如果你是通过命令行运行脚本,并且用了重定向(比如
php your_script.php > output.bin),那这个echo的输出就会追加到目标文件末尾,看起来像是fclose()写入的。 - 而Ruby代码里你没有做类似的输出操作,所以不会出现这个问题。
解决方案:
- 检查代码,移除所有不必要的
echo或print语句,尤其是那些输出fwrite()返回值的代码。比如把:
改成:echo fwrite($fp, $binary_content);fwrite($fp, $binary_content); - 如果你需要验证写入的字节数,可以把输出定向到标准错误,而不是标准输出:
$bytes_written = fwrite($fp, $binary_content); fwrite(STDERR, "Successfully written $bytes_written bytes\n"); - 另外,确保你在PHP中正确地将十六进制字符串转换为二进制字节:
推荐直接使用hex2bin()函数,避免手动str_split处理(容易出错):$hex_str = '1f8b08082907ac5a0400425231335f543133343535395f52494345433135305f343432373800cd96596e83301086df2bf50e39823dbb5f5ba552a4b66996deff2a1d0cc16c7d098b1809bc8d07cfa77f00c1b76bc47b44624ea136668d260ad1fb82d54c8c163082890fd5e4d0b17a0bd50d42b...'; $binary_data = hex2bin($hex_str); $fp = fopen('output.bin', 'wb'); fwrite($fp, $binary_data); fclose($fp);
额外检查点:
- 确认你的十六进制字符串长度是偶数,
hex2bin()会在字符串长度为奇数时抛出警告,可能导致部分数据丢失。 - 确保打开文件时使用
'wb'模式(二进制写入),避免系统自动转换换行符导致的意外问题。
内容的提问来源于stack exchange,提问作者vinicius gati
相关产品推荐
相关产品推荐

