неправильный размер файла чанка IJVM в вопросе c - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь реализовать IJVM для чтения двоичного файла.

Я понимаю, что файл .ijvm содержит 32-битное магическое число и любое количество блоков данных и что блок данных состоит из трех частей. Мое намерение состоит в том, чтобы сначала прочитать и сохранить магическое число, которое всегда имеет постоянный размер, а затем блок данных в другом массиве. Файл .ijvm выглядит так:

1 е. Д. Д. Объявление 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 байта?

1 Ответ

1 голос
/ 23 мая 2019
//dataBlocklen = ftell(fp); //outputs 4

Возвращает 4, поскольку текущее смещение файла составляет 4 байта, как вы сделали fread для магического номера до ftell.

fread(bufferMagic,1,4,fp);

и

dataBlocklen = sizeof(dataBlock); //outputs 8

Возвращает 8, поскольку dataBlock является указателем, поэтому sizeof(pointer) на вашем компьютере 8 byte.

...