Here是一个包含以下内容的二进制文件:
0xff 0xff 0xff
正好是三个字节。
我尝试使用dump_file
函数here
#include "table.h"
#include "debug.h"
typedef unsigned int Code
void dump_file( char* fileName[] )
{
char c;
for (int i = 0; i < 4; ++i)
{
log_info("File: %s",fileName[i]);
FILE* file = fopen(fileName[i],"rb");
fread(&c,sizeof(char),1,file);
while( !feof(file) ){
dump_code( c , 8 );
fread(&c,sizeof(char),1,file);
}
}
}
void dump_code( Code code,int BitsNum )
{
int mask = 1 << (BitsNum-1);
for (int i = 0; i < BitsNum ; ++i)
{
if(i%8==0)putchar('|');
putchar((mask & code) ? '1' : '0');
code <<= 1;
}
puts("");
}
以二进制格式打印文件,但它什么都不打印。 (不知怎的,它以不合需要的方式陷入EOF
??)
我也使用Unix unity xxd
。
当我发信号xxd
以二进制文件打印我的文件时,它什么都不打印。但如果我选择以十六进制方式打印,它会按预期打印。这个文件出了什么问题?
此文件由a parser生成。 C程序使用fseek
跳转到文件中的各个位置并打印相应的二进制代码。它可能会像:
第0个字节 - &gt;第1个字节 - &gt;第3个字节 - &gt;第5个字节 - &gt;第二个字节 - &gt;第4个字节 - &gt;第6个字节
保证结果文件中没有“泄漏”,即每个字节都将被遍历。
这种奇怪行为的原因是什么?
虽然samgak指出这可能是由于对0xff
的解释,但我的其他一些实验表明,即使是包含以下内容的文件:
0x01 0x01 0x01
会导致同样的现象。
以下是将Code
写入文件的相关代码:
#define CODE_FILE_NUM 3
void writeCode( FILE* out[] , Code code ){
for (int i = 0; i < CODE_FILE_NUM; ++i){
fwrite(&code,sizeof(char),1,out[i]);
code >>= 8;
}
}
Code
是unsigned int
,有4个字节。函数writeCode
仅考虑较低的3个字节,并将每个字节写入3个单独的文件。
答案 0 :(得分:1)
我找到了原因。 这是因为我忘了关闭输出文件。
我尝试转储未关闭的二进制文件(即:打开并从尚未关闭的文件中读取数据。),这会导致无法预测的行为。< / p>