0

IJVM を実装してバイナリ ファイルを読み取ろうとしています。

.ijvm ファイルには 32 ビットのマジック ナンバーと任意の数のデータ ブロックが含まれており、データ ブロックには 3 つの部分があることを理解しています。私の意図は、最初に常に一定サイズのマジックナンバーを読み取って保存し、次にデータブロックを別の配列に保存することです。.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 バイトを与えないのはなぜですか?

4

1 に答える 1