簡體   English   中英

將原始字節值轉換為Java類型

[英]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和它轉換到DoubleBufferLongBuffer等,您可以字節數組轉換成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.

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