c-二进制文件读取错误,是endian问题还是文件读取问题



目前我正在启动一个简单的c VM,它将二进制文件读入"内存"数组,然后获取解码并评估给定的指令。目前,我正纠结于如何将这个二进制文件正确地读取到内存中,以便以后在解码时使用,并根据2或4个字节对其进行分离。我的输入与我在下面的输出不匹配,我不确定这是一个endian问题,还是我没有正确地将文件读取到内存中。

MAIN.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXMEM 1024
unsigned memory[MAXMEM];
int loads(char *filename)
{
File *file = fopen(filename, "rb");
return fread(memory, sizeof *memory, MAXMEM, file);
}
int main(int argc, char **argv){
if(argc <= 1){
printf("No file Foundn");
return -1;
}
char *filename = argv[1];
loads(filename);
printf("%04xn", *memory);
}

INPUT.BIN(运行od -x --endian=big input.bin | head -5得到的数据(

00000000 b10a b200 1123

电流输出

b20ab1

期望输出

either b10a b200 1123 
or b1 0a b2 00 11 23

显示问题都在这句话中:

printf("%04xn", *memory);

首先使用一个表示要显示的格式的格式字符串。也许:

"%02x %02x %02x $02xn"

以下建议代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 正确处理I/O错误
  4. 不包括未使用的头文件

现在,提出的代码:

#include <stdio.h>
//#include <string.h>
#include <stdlib.h>  // exit(), EXIT_FAILURE
#define MAXMEM 1024
char memory[MAXMEM];
size_t loads(char *filename)
{
FILE *file = fopen(filename, "rb");
if( !file )
{
perror( "fopen for read failed" );
exit( EXIT_FAILURE );
}
return  fread(memory, sizeof *memory, MAXMEM, file);
}
int main(int argc, char **argv){
if( argc != 2 )
{
fprintf( stderr, "USAGE: %s inputFileNamen", argv[0] );
exit( EXIT_FAILURE );
}
char *filename = argv[1];
size_t fileSize = loads(filename);
printf( "File Size: %zun", fileSize );
printf("%02x %02x %02x %02xn", 
memory[0], 
memory[1], 
memory[2], 
memory[3]);
}

当针对同一源文件运行时,会导致:

File Size: 701
23 69 6e 63

注:23 69 6e 63#inc的十六进制值

我修改了内存类型为char。如果您想将其保持为unsigned,请注意,32位无符号包含8个半字节,因此对printf()的调用的格式字符串应该是%08x,用于显示的每个无符号值

相关内容

  • 没有找到相关文章

最新更新