目前,我正在研究一个简单的c VM的启动,该VM将二进制文件读入“内存”数组,然后将进行解码并评估给出的指令。此刻,我陷入了如何正确地将该二进制文件读取到内存中的问题,以便能够读取以供以后在基于2或4个字节进行解码和分离时使用。我的输入与我在下面输入的输出不匹配,我不确定这是否是字节序问题,或者我没有正确将文件读入内存。
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 Found\n");
return -1;
}
char *filename = argv[1];
loads(filename);
printf("%04x\n", *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("%04x\n", *memory);
首先使用一个格式字符串,该字符串代表您要显示的格式。也许:
"%02x %02x %02x $02x\n"
以下建议的代码:
现在,建议的代码:
#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 inputFileName\n", argv[0] );
exit( EXIT_FAILURE );
}
char *filename = argv[1];
size_t fileSize = loads(filename);
printf( "File Size: %zu\n", fileSize );
printf("%02x %02x %02x %02x\n",
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
。