2013-07-30 73 views
0

我需要閱讀包含此結構的二進制文件:的Java讀取二進制結構

struct iqmheader 
{ 
    char magic[16]; // the string "INTERQUAKEMODEL\0", 0 terminated 
    uint version; // must be version 2 
    uint filesize; 
    uint flags; 
    uint num_text, ofs_text; 
    uint num_meshes, ofs_meshes; 
    uint num_vertexarrays, num_vertexes, ofs_vertexarrays; 
    uint num_triangles, ofs_triangles, ofs_adjacency; 
    uint num_joints, ofs_joints; 
    uint num_poses, ofs_poses; 
    uint num_anims, ofs_anims; 
    uint num_frames, num_framechannels, ofs_frames, ofs_bounds; 
    uint num_comment, ofs_comment; 
    uint num_extensions, ofs_extensions; 
}; 

是否有這樣做的一個優雅的方式?我試過javolution LIB那樣:

import javolution.io.Struct; 
import java.nio.ByteOrder; 

public class IqmHeader extends Struct { 
    public final UTF8String magic = new UTF8String(16); 
    public final Unsigned8 version = new Unsigned8(); 
    public final Unsigned8 filesize = new Unsigned8(); 
} 

第2個值(魔法和版本)是正確的,但對於第三個i'm已經得到0,這是錯誤的。

文件用十六進制編輯器(第一字節,而不是整個文件)打開:

下面是從十六進制編輯器輸出:

49 4E 54 45 52 51 55 41 4B 45 4D 4F 44 45 4C 00 02 00 00 00 10 EF 03 00 00 00 00 00 60 03 00 00 7C 00 00 00 02 00 00 00 DC 03 00 00 06 00 00 00 45 07 00 00 0C 04 00 00 AC 0B 00 00 A0 9B 01 00 B0 27 02 00 4B 00 00 00 C0 B3 02 00 4B 00 00 00 D0 C1 02 00 01 00 00 00 98 DB 02 00 65 00 00 00 4D 01 00 00 AC DB 02 00 70 E2 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 6F 64 

我必須承認,我真的不知道如何閱讀。前16個字節是緊跟着「00」的字符串。然後版本「02」 - 在這裏,我不知道該UINT多少字節需要

有什麼建議?

+0

你能在十六進制編輯器打開該文件,並確保文件大小設置爲文件中的一個非零值? – hexafraction

+0

亞歷克斯:請編輯您的原始文章。 – hexafraction

+1

對Javolution不熟悉,但您確定Unsigned8是您的定義中使用的正確類型嗎?我猜測C int將對應於Unsigned32(假設這種類存在於Javolution中)。 –

回答

0

使用DataInputStreamreadUnsignedByte, readUnsignedShort, readUTF等來創建結構。

您可以使用Java類來表示的結構:

public class IQMHeader { 
    String magic; // the string "INTERQUAKEMODEL\0", 0 terminated 
    long version; // must be version 2 
    long filesize; 
    long flags; 
    long num_text, ofs_text; 
    long num_meshes, ofs_meshes; 
    long num_vertexarrays, num_vertexes, ofs_vertexarrays; 
    long num_triangles, ofs_triangles, ofs_adjacency; 
    long num_joints, ofs_joints; 
    long num_poses, ofs_poses; 
    long num_anims, ofs_anims; 
    long num_frames, num_framechannels, ofs_frames, ofs_bounds; 
    long num_comment, ofs_comment; 
    long num_extensions, ofs_extensions; 
}; 

可以讀取一個unsigned int,像這樣:

long unsigned = input.readInt() & 0xffffffffL; 
+0

嗯,似乎並沒有工作:fis =新FileInputStream(「c:\\ temp \\ mrfixit.iqm」); DataInputStream dis = new DataInputStream(fis); System.out.println(dis.readUTF()); - > java.io.UTFDataFormatException:約21字節畸形 –

+1

輸入我忘了告訴,數據存儲小端。我認爲DataInputStream是大端 –

0

至於評論,你可能想使用UNSIGNED32表示嘗試Java類中的版本和其他C ints而不是Unsigned8,因爲C int應該是4個字節,而Unsigned8只能表示1個字節。