簡體   English   中英

在Java中將C的uint32轉換為int的正確方法

[英]Proper way of converting C's uint32 to int in java

我正在構建一個由多個組件組成的項目,這些組件使用套接字以字節數組形式相互通信。 問題是一個組件是用C編寫的,並且支持Unsigned基本類型,而其他組件是用Java編寫的,不支持Unsigned類型。 我試圖在Java中開發對Unsigned類型的支持。 我是Java新手。 誰能告訴我從字節數組解碼uint32和uint64的正確方法。

我正在使用以下函數來轉換int32和int64

public static int int32Converter(byte b[], int start) {
    return ((b[start] << 24) & 0xff000000 |(b[start + 1] << 16) & 0xff0000
            | (b[start + 2] << 8) & 0xff00 | (b[start + 3]) & 0xff);
}
public static long int64Converter(byte buf[], int start) {
    return ((buf[start] & 0xFFL) << 56) | ((buf[start + 1] & 0xFFL) << 48)
            | ((buf[start + 2] & 0xFFL) << 40)
            | ((buf[start + 3] & 0xFFL) << 32)
            | ((buf[start + 4] & 0xFFL) << 24)
            | ((buf[start + 5] & 0xFFL) << 16)
            | ((buf[start + 6] & 0xFFL) << 8)
            | ((buf[start + 7] & 0xFFL) << 0);
}

謝謝!

您不能完全“轉換”它們。 最接近處理無符號值的是Guava的UnsignedInteger及其實用程序類UnsignedInts 字節,短褲和多頭也一樣。

請注意您的代碼,不要費心手工編寫此類內容,請使用ByteBuffer

public static int bytesToInt(final byte[] array, final int start)
{
     final ByteBuffer buf = ByteBuffer.wrap(array); // big endian by default
     buf.position(start);
     buf.put(array);
     return buf.position(start).getInt();
}

將Guava用於無符號int:

public static UnsignedInteger bytesToUnsignedInt(final byte[] array, final int start)
{
         return UnsignedInteger.fromIntBits(bytesToInt(array, start);
}

但是,我懷疑UnsignedInts確實是您想要的。 (為了進行比較,將它們打印出來等)

此代碼會將數組中的字節復制到int中。 索引0(值1)處的字節是LSB。 索引3(值15)是MSB:

byte[] bytes = { 1, 3, 7, 15 };
int result = 0; 
for (int i = 0 ; i < bytes.length ; i++) { 
    result |= bytes[i]<<(i*8); 
}
System.out.println(Integer.toBinaryString(result));

打印:

1111000001110000001100000001

如果將其更改為long並為其提供了一個更長的字節數組,並且將Integer.toBinaryString()從Long更改為1,它也將運行很長時間。

從現在開始,您永遠不要將long / int作為常規十進制值打印到屏幕上。 當需要與眼睛比較時,打印二進制或十六進制值。 Long.toHexString(長)。

如果uint32的值從未超過2 ^ 31,則可以將它們存儲在Java int中。 如果沒有,那么您將需要一個Java Long。

對於uint64,則如果該值從未超過2 ^ 63,則可以使用long,否則將需要BigInteger。

無論哪種情況,如果要移植的算法都依賴於換行(即值溢出整數並返回0),則需要添加自己的手動邏輯來處理這些情況。

暫無
暫無

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

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