c - c问题中IJVM block 文件的大小错误

标签 c binaryfiles sizeof ftell ijvm

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

据我所知,.ijvm 文件包含一个 32 位魔数(Magic Number)和任意数量的数据 block ,并且数据 block 由三个部分组成。 我的目的是首先读取并存储始终大小恒定的魔数(Magic Number),然后将数据 block 存储到不同的数组中。 .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。其余的是数据 block 。
读取文件后,我确定总大小为 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

返回4,因为当前文件偏移量位于第 4 个字节,正如您在 ftell 之前对 magicnumber 所做的 fread 操作一样。

fread(bufferMagic,1,4,fp);

dataBlocklen = sizeof(dataBlock); //outputs 8

返回8,因为dataBlock是指针,因此sizeof(pointer)在您的机器上是8字节

关于c - c问题中IJVM block 文件的大小错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56273629/

相关文章:

c - 如何构建嵌入 Lua 的 C 程序

c - 使用指针了解数组的大小

javascript - Internet Explorer - DOM7011 : The code on this page disabled back and forward caching. 尝试使用 Javascript 下载二进制文件后出现警告

c - 菜鸟关于malloc和sizeof的问题

c++ - size_t 的大小是否始终等于 void * 的大小

c++ - 知道 .lib 是静态的还是导入的

c - C89 标准中的哪一部分允许 "implicit int"规则?

c - 有人知道不依赖 gcc 的 C 编译器吗?

powershell - 将.EXE编码/解码为Base64

c++ - 使用 write() 复制二进制文件,复制文件的大小增加