[英]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值。 您定義了這樣一個字符串,並將其作為pack或unpack函數的參數以及要打包/解包的字節提供。 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參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.