二进制文件,只能以十六进制格式打印,但不能以二进制格式打印

时间:2015-01-17 09:05:56

标签: c binary

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个字节

保证结果文件中没有“泄漏”,即每个字节都将被遍历。

这种奇怪行为的原因是什么?


更新1

虽然samgak指出这可能是由于对0xff的解释,但我的其他一些实验表明,即使是包含以下内容的文件:

0x01 0x01 0x01

会导致同样的现象。


更新2

以下是将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; 
    }
}

Codeunsigned int,有4个字节。函数writeCode仅考虑较低的3个字节,并将每个字节写入3个单独的文件。

1 个答案:

答案 0 :(得分:1)

我找到了原因。 这是因为我忘了关闭输出文件。

我尝试转储未关闭的二进制文件(即:打开并从尚未关闭的文件中读取数据。),这会导致无法预测的行为。< / p>

相关问题