奇怪的0x0D被添加到我的二进制文件中

我有这个奇怪的问题:

我写了16个字符到一个二进制文件,然后我写了3个整数但是当我用一些二进制文件查看器打开我的文件时,我看到一个额外的字节被添加(等于0x0D )。

这是我的代码:

for(i = 0; i < 16; i++) { if(i < strlen(inputStr)) { myCharBuf[0] = inputStr[i]; } else { myCharBuf[0] = 0; } fwrite(myCharBuf, sizeof(char), 1, myFile); } myIntBuf[0] = inputNumber1; fwrite(myIntBuf, sizeof(int), 1 ,myFile); myIntBuf[0] = inputNumber2; fwrite(myIntBuf, sizeof(int), 1 ,myFile); myIntBuf[0] = inputNumber3; fwrite(myIntBuf, sizeof(int), 1 ,myFile); 

我得到以下字节值:

61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0D 0A 00 00 00 05 00 00 00 08 00 00 00

当我期待:

61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0A 00 00 00 05 00 00 00 08 00 00 00

有谁知道为什么会发生这种情况?

0A是换行符,0D是回车符。 这些通常与文本模式相关联。

你是否以二进制模式打开文件? (例如fopen("foo.txt", "wb" ))

当您打开文件时,打开以写为二进制"wb"

 fopen(filename, "wb"); 

在文本模式下打开时,会发生0D行( 0A )和回车( 0D )的转换。

使用“wb”以二进制模式fopen文件。

 fopen(filename, "wb"); 

否则,库中的代码将进行自动行结束翻译(在Windows 上的Windows上,不是吗?这意味着将'\n'翻译为'\r' '\n' )。

MS-DOS(今天使用Windows),在文本模式下写入文件时,在每个0x0A之前添加一个0x0D。 换句话说,它处理任意数据流,因为它们往返于商店和混淆数据 – 完全是彻头彻尾的疯狂。

以二进制模式打开文件以进行非疯狂处理。

我相信你的inputStr变量包含一个换行符,它被写入二进制文件作为回车符和换行符 – 二进制’0D’后跟’0A’。

例如,以下程序如下写入16个字符和3个数字。

 FILE *fp; fp = fopen("sample.bin", "wb+"); if(fp == NULL) { printf("Cannot create a file\n"); return; } int i; char c[1] = {'A'}; for(i = 0; i < 16; i++) { fwrite(c, sizeof(char), 1, fp); c[0]++; } int ip[1] = {1}; fwrite(ip, sizeof(int), 1, fp); fwrite(ip, sizeof(int), 1, fp); fwrite(ip, sizeof(int), 1, fp); fclose(fp); 

如果使用转储程序(如'od')查看'sample.bin'文件,则会按如下方式提供内容。

 od -t x1 -c sample.bin 0000000 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 ABCDEFGHIJKLMNOP 0000020 01 00 00 00 01 00 00 00 01 00 00 00 001 \0 \0 \0 001 \0 \0 \0 001 \0 \0 \0 0000034 

这段代码

  #include  #define SECTORSIZE 512 // bytes per sector int main(int argc, char *argv[]) { FILE *fp; // filepointer size_t rdcnt; // num. read bytes unsigned char buffer[SECTORSIZE]; if(argc < 2) { fprintf(stderr, "usage:\n\t%s device\n", argv[0]); return 1; } fp = fopen(argv[1], "rb"); if(fp == NULL) { fprintf(stderr, "unable to open %s\n",argv[1]); return 1; } rdcnt = fread(buffer, 1, SECTORSIZE, fp); if(rdcnt != SECTORSIZE) { fprintf(stderr, "reading %s failed\n", argv[1]); fclose(fp); return 1; } fwrite(buffer, 1, SECTORSIZE, stdout); fclose(fp); return 0; } 

请从这里采取https://redeaglesblog.wordpress.com/2011/04/05/sektoren-eines-datentragers-lesen/

从任何给定磁盘读取引导扇区

粘贴在您首选的C(ANSI)IDE或编辑器中,它在Windows(mingw传递\。\ PhysicalDriveX)和linux(gcc传递/ dev / sdX)中编译和工作

但它只是在Linux中的魅力,而它无论如何在任何x0A之前插入/添加x0D,而不是fp = fopen(argv[1], "rb");

我用mingw作为readsect.exe从code :: blocks编译它并运行它读取我硬盘的启动扇区

 c:\readsect.exe \\.\PhysicalDrive0 > read.bin 

read.bin文件的结果长度为515字节而不是512字节。

使用能够打开物理驱动器的HEX编辑器,我将引导扇区内容与read.bin内容进行了比较。

好吧,物理引导扇区中的每个x0A(x0A被发现3次),在read.bin文件中被转储为x0D + X0A。 所以我有三个x0D,三个字节。

谷歌,它看起来像一个广泛报道的问题。

你们有没有找到修复方法? 也许stdio.h需要修复windows环境?

谢谢