我有一个奇怪的问题:
我写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 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
0D 0A 00 000 000 05 000 000 000 000 08 000 000 000 000
When I expect:
61 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
0A 00 000 000 05 000 000 000 000 08 000 000 000 000
有人知道为什么会发生吗?
0A是换行字符,0D是回车符。这些通常与文本模式相关。
您是否以二进制模式打开了文件?(如fopen("foo.txt", "wb"
))
打开文件时,打开二进制"wb"
:
fopen(filename, "wb");
当您在文本模式下打开时,会发生换行(0A
)和回车(0D
)的翻译。
fopen
二进制格式文件
fopen(filename, "wb");
否则,库中的代码将执行自动行尾翻译(在windows上您在windows上,不是吗?表示将'n'
转换为'r' 'n'
)。
我相信你的inputStr变量包含一个换行符,它被写入二进制文件作为回车和换行-二进制'0D'后面跟着'0A'。
例如,下面的程序写出16个字符和3个数字,如下所示:
FILE *fp;
fp = fopen("sample.bin", "wb+");
if(fp == NULL)
{
printf("Cannot create a filen");
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 001 001
0000034
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:nt%s devicen", argv[0]);
return 1;
}
fp = fopen(argv[1], "rb");
if(fp == NULL)
{
fprintf(stderr, "unable to open %sn",argv[1]);
return 1;
}
rdcnt = fread(buffer, 1, SECTORSIZE, fp);
if(rdcnt != SECTORSIZE)
{
fprintf(stderr, "reading %s failedn", 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中像一个魅力一样工作,尽管fp = fopen(argv[1], "rb");
我已经编译了它从代码::块与mingw作为readsect.exe
和运行它读取我的硬盘驱动器的引导扇区
c:readsect.exe \.PhysicalDrive0 > read.bin
文件read.bin的结果是515字节而不是512字节。
使用能够打开物理驱动器的HEX编辑器,我已经将我的引导扇区内容与read.bin中的内容进行了比较。
嗯,在read.bin文件中,物理引导扇区中的每个x0A (x0A被发现3次)都被转储为x0D + x0A。所以我有三个x0D,三个字节。
谷歌,这似乎是一个广泛报道的问题。
你们中有人找到修复方法了吗?也许studio .h需要修复windows环境?
谢谢