неправильный размер файла фрагмента IJVM в вопросе c

Я пытаюсь реализовать 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 байта?


person sir Hoyle    schedule 23.05.2019    source источник
comment
Небольшая ошибка, sizeof(dataBlock) всегда равен 8 в 64-битной программе. Размер указателя. Вы уже знаете размер, но не использовали переменную для его хранения, это sizeof(byte_t) * filelen - 4.   -  person Hans Passant    schedule 23.05.2019


Ответы (1)


//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 на вашем компьютере.

person kiran Biradar    schedule 23.05.2019
comment
@sirHoyle, пожалуйста, не забудьте принять этот ответ, чтобы отметить свой вопрос как решенный ( Что мне делать, когда кто-то ответит на мой вопрос? ) - person bruno; 23.05.2019
comment
@sirHoyle На самом деле вы должны делать это для всех вопросов, которые вы задали, так вы выражаете благодарность тому, кто вам помог. - person kiran Biradar; 23.05.2019