簡體   English   中英

從二進制文件中讀取結構化數據 - ?

[英]Read structured data from binary file -?

我知道文件結構,假設這個結構是這樣的:

[3-bytes long int],[1-byte long unsigned integer],[4-bytes long unsigned integer]

因此該文件包含此類記錄的鏈。

在Java中解析這樣一個文件最優雅的方法是什么?

據說,我們可以定義一個總長度的byte []數組並用InputStream讀取它,但是如何將它的子元素轉換成正確的整數值呢?

首先,java中的字節值是有符號的,在我們的例子中我們需要無符號值。 接下來,有沒有有用的方法允許將字節的子數組(例如,從1-st到4的字節轉換為正確的整數值)?

我知道,Perl中有函數pack和unpack,允許你將一個字節字符串表示為表達式,假設“VV”表示2個無符號long int值。 您定義了這樣一個字符串,並將其作為packunpack函數的參數以及要打包/解包的字節提供。 Java / Apache庫等中有這樣的東西嗎?

喜歡@Bryan Kyle的例子但更短。 我喜歡更短,但這並不意味着更清楚,你決定。 ;)注意:readByte()已簽名,如果未使用0xFF屏蔽,則會產生意外結果。

DataInputStream dis = ... 

// assuming BIG_ENDIAN format
int a = dis.read() << 16 | dis.read() << 8 | dis.read(); 
short b = (short) dis.read(); 
long c = dis.readInt() & 0xFFFFFFFFL; 

要么

ByteBuffer bb = 
bb.position(a_random_postion);
int a = (bb.get() & 0xFF) << 16 | (bb.get() & 0xFF) << 8 | (bb.get() & 0xFF); 
short b = (short) (bb.get() & 0xFF); 
long c = bb.readInt() & 0xFFFFFFFFL; 

您可以查看此示例BinaryReader類,該類基於DataInputStream類。

您應該能夠使用DataInputStream執行此操作。 我已經做了很多這樣的開發已經有一段時間了,但我似乎記得的訣竅是,如果輸入格式和語言數據類型之間存在阻抗不匹配,則需要逐字節構造數據。 在這種情況下,您似乎需要這樣做,因為數據結構具有奇怪的大小結構。

為了給你一個例子來讀取第一條記錄你可能需要做這樣的事情(我使用a,b和c作為記錄的屬性)

DataInputStream dis = ...

int a = 0;
a = dis.readByte();
a = a << 8;         
a = a | dis.readByte();
a = a << 8;
a = a | dis.readByte();

short b = 0;
b = dis.readByte();

long c = 0;
c = dis.readByte();
c = c << 8;
c = c | dis.readByte();
c = c << 8;
c = c | dis.readByte();
c = c << 8;
c = c | dis.readByte();

顯然,這個代碼可以通過復合一些語句來收緊,但是你得到了一般的想法。 您可能會注意到,對於每個要讀取的屬性,我必須使用比所需大的原語,因此沒有任何溢出錯誤。 供Java參考:

  • byte = 1個字節
  • short = 16位,2個字節
  • int = 32位,4個字節
  • long = 64位,8個字節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM