MinGW G++(Windows)下fwrite写入字节异常及0D字节含义咨询
问题解答:Windows下写入char值10变成0D 0A的原因
这个问题其实是Windows平台特有的文件换行机制在作祟,我来给你拆解清楚:
核心原因:文本模式的自动转换
你代码里用fopen("aa.bin", "w")打开文件时,用的是文本模式(这是Windows下fopen的默认模式)。在Windows系统中,C标准库的文本模式会自动把Unix风格的换行符\n(ASCII值为10,也就是你数组里的10)转换成Windows标准的换行序列\r\n——对应十六进制的0D 0A。
0D字节是什么?
十六进制的0D对应的是ASCII字符\r,也就是回车符(Carriage Return)。在早期打字机时代,它的作用是让打印头回到行首;到了电脑系统里,Windows选择用\r\n的组合来表示换行(先回车再换行),而Unix/Linux类系统只需要\n(直接换行)。
怎么解决这个问题?
如果你想原封不动写入二进制数据(比如你的unsigned char数组),需要用二进制模式打开文件,把fopen的第二个参数改成"wb":
FILE *ff = fopen("aa.bin", "wb");
这样修改后,写入的十六进制内容就会和你数组里的原始值完全一致:0A 0A B4 FF 28,不会再有额外的0D字节。
补充一句:哪怕你把文件名命名为.bin,只要用文本模式打开,Windows的C标准库还是会触发换行符转换,这点要特别注意~
内容的提问来源于stack exchange,提问作者Osama Mohammed
相关产品推荐
相关产品推荐

