读取C中的bin文件无法正常工作

嘿,我现在必须上课做一些练习,但是我被困住了。我是C语言中的血腥初学者,必须编写一个vm。

我正在尝试读取.bin文件,以获取诸如格式,版本,指令数量之类的信息...

那是我的代码

FILE *inputFile;
char *charBuffer;
int *intBuffer;
long filelen;
char *inputPath = argv[i + 1];
inputFile = fopen(inputPath,"r");
fseek(inputFile,SEEK_END);         
filelen = ftell(inputFile);             
rewind(inputFile);
charBuffer = (char *)malloc((filelen+1)*sizeof(char));
intBuffer = (int *)malloc((filelen+1)*sizeof(int));

fread(charBuffer,sizeof(char),4,inputFile);

char *format = charBuffer;
printf("format: %s\n",format);

fread(intBuffer,sizeof(int),1,inputFile);
int *version = intBuffer;
printf("version: %ls\n",version);

fread(intBuffer,inputFile);
int *instructionCount = intBuffer;
printf("instruction Count: %ls\n",instructionCount);

fread(intBuffer,inputFile);
int *variables = intBuffer;
printf("variable Count: %ls\n",variables);

这就是输出:

读取C中的bin文件无法正常工作

NJBF是正确的,但是我期望版本为2。为什么这样一个带有数字的怪异立方体?为什么指令和变量为空?

不幸的是,这堂课每周只有一次,我不能问老师。

这就是test1.bin打开的hexdump中的内容

00000000  4e 4a 42 46 02 00 00 00  0b 00 00 00 00 00 00 00  |NJBF............|
00000010  03 00 00 01 04 00 00 01  00 00 00 02 0a 00 00 01  |................|
00000020  06 00 00 01 00 00 00 03  00 00 00 04 00 00 00 08  |................|
00000030  0a 00 00 01 00 00 00 0a  00 00 00 00              |............|
0000003c

这些是规则:

  4 bytes        'N','J','B','F' (identifies the format)
  4 bytes        version number (must match the VM's version number)
  4 bytes        number of instructions contained in the file
  4 bytes        number of variables in the static data area
  n * 4 bytes    instructions (the program to be executed)
introject 回答:读取C中的bin文件无法正常工作

版本号是int,而不是字符串。您需要使用%d格式,并取消引用指针。

printf("version: %d\n",*intBuffer);

在使用charBuffer打印之前,您还需要向%s添加一个空终止符。

fread(charBuffer,sizeof(char),4,inputFile);
charBuffer[4] = 0;
printf("Format: %s\n",charBuffer);
,

您似乎想用此行将整数数据作为char打印:

printf("version: %ls\n",version);

由于不能将数据(整数)表示为ASCII字符,因此您的终端输出了奇怪的多维数据集。

尝试:

printf("version: %d\n",*version);

这应该取消引用您的整数指针,并将其打印为“原始”整数。

,

我可能会从这样的东西开始


#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>

typedef struct
{
  char format[5];
  uint32_t version;
  uint32_t instruction_count;
  uint32_t variable_count;
  uint32_t *instructions;
} VmInfo;

uint32_t
u32_from_LE_bytes(const uint8_t *bytes)
{
  return (((uint32_t)bytes[0])<< 0)|
         (((uint32_t)bytes[1])<< 8)|
         (((uint32_t)bytes[2])<<16)|
         (((uint32_t)bytes[3])<<24);
}

bool // success
load_VmInfo(VmInfo *out_info,const char *filename)
{
  FILE *input=fopen(filename,"rb");
  if(!input)
  {
    return false;
  }
  uint8_t raw_header[16];
  if(fread(raw_header,sizeof(raw_header),1,input)!=1)
  {
    fclose(input);
    return false;
  }
  memcpy(out_info->format,raw_header,4);
  out_info->format[4]='\0';
  out_info->version=u32_from_LE_bytes(raw_header+4);
  out_info->instruction_count=u32_from_LE_bytes(raw_header+8);
  out_info->variable_count=u32_from_LE_bytes(raw_header+12);
  const size_t amount=out_info->instruction_count*sizeof(uint32_t);
  out_info->instructions=(uint32_t *)malloc(amount);
  if(!out_info->instructions)
  {
    abort();
  }
  if(fread(out_info->instructions,amount,input)!=1)
  {
    fclose(input);
    free(out_info->instructions);
    return false;
  }
  for(uint32_t i=0; i<out_info->instruction_count; ++i)
  {
    const uint8_t *bytes=(const uint8_t *)out_info->instructions+i;
    out_info->instructions[i]=u32_from_LE_bytes(bytes);
  }
  fclose(input);
  return true;
}

int
main(void)
{
  VmInfo info;
  if(!load_VmInfo(&info,"test1.bin"))
  {
    fprintf(stderr,"bad VM file\n");
    return 1;
  }
  printf("format: %s\n",info.format);
  printf("version: %u\n",info.version);
  printf("instruction_count: %u\n",info.instruction_count);
  printf("variable_count: %u\n",info.variable_count);
  for(uint32_t i=0; i<info.instruction_count; ++i)
  {
    printf("  %u\n",info.instructions[i]);
  }
  free(info.instructions);
  return 0;
}

糟糕,抱歉,我迟到了,我在写作时没有看到可接受的答案。

本文链接:https://www.f2er.com/3156324.html

大家都在问