Двоичные данные не печатаются правильно - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь распечатать двоичные данные, и они получаются в виде длинных шестнадцатеричных строк, хотя я использую спецификатор формата %02x, который, как я думал, должен был выводить один байт (2 шестнадцатеричных цифры). Вот код ( строка 79 является проблемой):

void ReadFile( char *name ){
     FILE *file;
     FILE *fOutput;
     char *buffer;
     unsigned long fileLen;
     //Open ORF file
     file = fopen( name, "rb" );
     if( !file ){
        fprintf( stderr, "Unable to open file %s", name );
        return;
     }

     // Open output file
     fOutput = fopen( "orf_dump", "wb" );
     if( ! fOutput ){
         fprintf( stderr, "Unable to open output file %s", "orf_dump" );
         return;
     }

     //Get file length
     fseek( file, 0, SEEK_END );
     fileLen=ftell( file );
     fseek( file, 0, SEEK_SET );

     //Allocate memory
     buffer = (char *)malloc( fileLen + 1 );
     if( !buffer ){
         fprintf(stderr, "Memory error!");
         fclose(file);
         return;
     }

     //Read file contents into buffer
     fread( buffer, fileLen, 1, file );
     fclose(file);

      //Do what ever with buffer
     int xBuffer = 30000;
     for( ; xBuffer < 30100; xBuffer++ ){
         printf( "%02x ", buffer[ xBuffer ] ); // Problematic line (79)
         fwrite( buffer + xBuffer, 1, 1, fOutput );
     }
     printf( "\n" );
     free(buffer);
 }

Когда я использую hexdump для вывода выходного файла, он выглядит правильно:

hexdump orf_dump
0000000 3477 d52f 63fe e57f 0af9 d471 c981 e7e0
0000010 1fd3 8cc5 03f6 758c 98e6 0f77 4942 a607
0000020 e340 989e 9ec2 f784 b93d dfe0 fcf0 c21d
0000030 00ff fc97 c80f f94e 7720 f5c9 3dc8 e908
0000040 a7cf 3ebf 618d 9391 c186 b81d 1d03 dc71
0000050 9d0e 1d01 2789 0834 c956 79e8 3afd ede4
0000060 803e 73fb
0000064

1 Ответ

0 голосов
/ 14 января 2019

Значения суб-целого размера повышаются при передаче (char x=42; printf("%d", x) передает x как int). Если вы рекламируете отрицательное знаковое значение, оно расширяется до знака (например, знаковый символ 0xf0 расширяется до 0xfffffff0).

Ширина в printf (2 в вашем %02x) - это минимальная ширина. Если значение не умещается в таком количестве символов, используются другие. Если вы хотите напечатать один байт, вам нужно извлечь только тот байт, который вы хотите напечатать (например, через val & 0xff), или избегать расширения знака, начиная со значения без знака.

...