[英]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.