[英]Converting raw-byte values into Java types
將原始字節值轉換為Java類型時遇到問題。 我正在通過數據報套接字接收字節作為字節數組。 我確切地知道哪個字節意味着什么,但是我不知道如何正確地轉換它們(我的意思是我知道偏移量,但是不知道我認為收到的內容是否正確;)。
例如,我想將16位unsigned short轉換為java int類型。 我在網上找到了一些示例,其中一個是:
public int getUShort(byte[] bytes, int offset) {
int b0 = bytes[offset] & oxFF;
int b1 = bytes[offset + 1] & oxFF;
return (b1 << 8) + (b0 << 0);
另一個是相同的,但最后一行是:
return (b0 << 8) + b1;
當然,它給出不同的結果。 哪一個是正確的? 您能否也給我一個有效的示例,但要在無符號的情況下進行同樣的長時間?
先感謝您!
我不得不做類似這樣的一些工作了一段時間后,我發現,做這種工作的最好方法是使用ByteBuffer
和它轉換到DoubleBuffer
, LongBuffer
等,您可以字節數組轉換成ByteBuffer
通過調用
ByteBuffer myBuffer = ByteBuffer.wrap(myRawArray);
從那里,您可以通過調用以下命令以int
列表的形式查看字節
IntBuffer myIntBuffer = myBuffer.asIntBuffer();
然后您可以通過調用轉換字節
int nextInt = myIntBuffer.get();
這些類還對批量獲取操作提供了很多支持,因此,如果您知道您正在通過網絡接收一大堆相同類型的數據,則可以非常快速地進行轉換。
如果可能的話,一種替代方法是使用某種基於Java的序列化來通過網絡發送數據。 這使您可以使用流編寫器類更輕松地進行轉換。 當然,這可能不可用,尤其是在與非Java服務器通信時,但這可能值得探索。
真的很晚了。
兩者都基於數據的正確性是正確的。 看到這里: http : //en.wikipedia.org/wiki/Endianness
return (b1 << 8) + b0;//little endian
return (b0 << 8) + b1;//big endian
您可以使用DataInputStream或ByteBuffer讀取各種類型。 對於大多數操作,您可以將帶符號類型用作無符號值。 我編寫了一個簡單的類來說明如何使用帶符號的類型,就像它們是未簽名的一樣。
ByteBuffer b = ByteBuffer.wrap(bytes);
short s = b.getShort();
long l = b.getLong();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.