二进制数据无法正确打印

时间:2019-01-14 18:21:32

标签: c printf binary-data

我正在尝试打印二进制数据,即使我使用的是%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 :(得分:2)

传递时将提升子整数大小的值(char x=42; printf("%d", x)作为整数传递x)。如果您提倡负的带符号值,则将其带符号扩展名(例如,带符号的字符0xf0扩展为0xfffffff0)。

printf中的宽度(2中的%02x)是最小宽度。如果该值不适合太多字符,则使用更多字符。如果要打印单个字节,则只需提取要打印的字节(例如,通过val & 0xff),或者通过从无符号值开始避免符号扩展。