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

时间:2011-04-04 10:12:04

标签: c file binary

我有这个奇怪的问题:

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

这是我的代码:

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

有没有人知道为什么会这样?

6 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:11)

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

fopen(filename, "wb");

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

答案 2 :(得分:7)

fopen二进制模式下的文件“wb”。

fopen(filename, "wb");

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

我相信你的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
           A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P
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

答案 5 :(得分:0)

此代码

    #include <stdio.h>

#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环境?

谢谢