[英]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.