繁体   English   中英

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

[英]Strange 0x0D being added to my binary file

我有这个奇怪的问题:

我将 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。 换句话说,它在任意数据流进出商店时处理它们并弄乱他们的数据 - 完全,完全疯狂。

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

这段代码

    #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");

我已经将它从 code::blocks 编译为 mingw 作为readsect.exe并运行它读取我的硬盘驱动器的引导扇区

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

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

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

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

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

你们中有人找到了解决方法吗? 也许 stdio.h 需要修复 windows 环境?

谢谢

我相信您的 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM