Yun-Chih Chen
Yun-Chih Chen

Reputation: 553

Binary file that can only be printed in hex format , but not binary format

Here is a binary file that contains:

0xff 0xff 0xff

which is exactly three bytes.

I try to use the dump_file function 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("");
}

to print the file in binary format, but it prints nothing. ( Somehow it bumps into EOF in an undesirable manner ?? )

I also use the Unix unity xxd. When I signal xxd to print my file in binary, it prints nothing. But if I choose to print hexademically, it prints as expected. What's wrong with this file?

This file is generated by a parser. The C program uses fseek to jump to various location in a file and print the corresponding binary code. It might go like:

0th byte --> 1st byte --> 3rd byte --> 5th byte --> 2nd byte --> 4th byte --> 6th byte

It is guaranteed that there is no "leak" in the resulting file, i.e, every byte will be traversed.

What is the reason for this strange behavior?


Update 1

While pointed out by samgak that this might be due to the interpretation of 0xff, some of my other experiments indicate that even file containing:

0x01 0x01 0x01

which results in the same phenomenon.


Update 2

Here's the relevent code that write Code into file:

#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 is an unsigned int, which has 4 bytes. Function writeCode will only consider the lower 3 bytes and write each byte into 3 seperate files.

Upvotes: 0

Views: 123

Answers (1)

Yun-Chih Chen
Yun-Chih Chen

Reputation: 553

I have found the reason. It's because I forgot to close the output files.

I tried to dump unclosed binary files ( That is: open and read data from files that haven't been closed. ) , which resulted in unpredictable behaviors.

Upvotes: 1

Related Questions