我正在尝试打印二进制数据,即使我使用的是%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
答案 0 :(得分:2)
传递时将提升子整数大小的值(char x=42; printf("%d", x)
作为整数传递x
)。如果您提倡负的带符号值,则将其带符号扩展名(例如,带符号的字符0xf0
扩展为0xfffffff0
)。
printf
中的宽度(2
中的%02x
)是最小宽度。如果该值不适合太多字符,则使用更多字符。如果要打印单个字节,则只需提取要打印的字节(例如,通过val & 0xff
),或者通过从无符号值开始避免符号扩展。