c问题中的IJVM块文件的错误



我正在尝试实现ijvm读取二进制文件。

我知道.ijvm文件包含一个32位魔术数和任意数量的数据块,并且数据块具有三个部分。我的目的是首先读取和存储始终具有恒定大小的魔术数,然后将数据块转换为其他数组。.ijvm文件看起来像这样:

1D EA DF AD 00 01 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 07 10 30 10 31 60 fd ff

第一个字节(1d ea df ad(是魔术n。其余的数据块。
阅读文件后,我确定总尺寸为27个字节,因此其余的应为23个字节。
但是,无论我尝试什么,尽管存储和阅读魔术和数据部分,但我总是得到错误的数据零件大小,而不是我认为应该的23个字节。

byte_t bufferMagic[4];
byte_t *dataBlock;
FILE *fp;
uint32_t filelen;
uint32_t dataBlocklen;
fp = fopen(binary_file, "r");
fseek(fp, 0, SEEK_END); //compute the size of the file
filelen = ftell(fp);
fseek(fp, 0, SEEK_SET);
fprintf(stderr,"file:%s is %d bytes longn",binary_file,filelen); //outputs27
//read magic number
fread(bufferMagic,1,4,fp);
fprintf(stderr, "Magic number: 0x%02hhx%02hhx%02hhx%02hhx n",
    bufferMagic[0],bufferMagic[1],bufferMagic[2],bufferMagic[3]);
//read data block
dataBlock = (byte_t*)malloc(sizeof(byte_t) * filelen - 4);
//dataBlocklen = ftell(fp); //outputs 4
dataBlocklen = sizeof(dataBlock); //outputs 8
fread(dataBlock,1,filelen - 4,fp); //reads data block correctly

您能解释一下我想念什么吗?为什么两个datablocklen不给出23个字节?

//dataBlocklen = ftell(fp); //outputs 4

返回4,因为当前文件偏移量在第4个字节,就像您在ftell之前对MagicNumber所做的fread

fread(bufferMagic,1,4,fp);

dataBlocklen = sizeof(dataBlock); //outputs 8

返回8,因为dataBlock是指针,因此sizeof(pointer)是计算机上的8 byte

相关内容

  • 没有找到相关文章

最新更新