c问题中IJVM块文件的大小错误
wrong size of IJVM chunk file in c question
我正在尝试实现 IJVM 并读取二进制文件。
我了解 .ijvm 文件包含一个 32 位幻数和任意数量的数据块,并且一个数据块包含三个部分。
我的意图是首先读取并存储始终大小不变的幻数,然后将数据块存储到不同的数组中。
.ijvm 文件如下所示:
1d ea df ad 00 01 00 00 00 00 00 00 00 00 00 00
00 00 00 07 10 30 10 31 60 fd ff
前 4 个字节 (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 long\n",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
Returns 4
因为当前文件偏移量位于第 4 个字节,就像您在 ftell
.
之前对 magicnumber 所做的那样 fread
fread(bufferMagic,1,4,fp);
和
dataBlocklen = sizeof(dataBlock); //outputs 8
Returns 8
因为 dataBlock
是指针,因此 sizeof(pointer)
在您的机器上是 8 byte
。
我正在尝试实现 IJVM 并读取二进制文件。
我了解 .ijvm 文件包含一个 32 位幻数和任意数量的数据块,并且一个数据块包含三个部分。 我的意图是首先读取并存储始终大小不变的幻数,然后将数据块存储到不同的数组中。 .ijvm 文件如下所示:
1d ea df ad 00 01 00 00 00 00 00 00 00 00 00 00
00 00 00 07 10 30 10 31 60 fd ff
前 4 个字节 (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 long\n",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
Returns 4
因为当前文件偏移量位于第 4 个字节,就像您在 ftell
.
fread
fread(bufferMagic,1,4,fp);
和
dataBlocklen = sizeof(dataBlock); //outputs 8
Returns 8
因为 dataBlock
是指针,因此 sizeof(pointer)
在您的机器上是 8 byte
。