我正在寫入具有uint32的存儲格式,允許的最大值爲「4294967295」。Java uint32(存儲爲long)到4字節數組
Java中的整數當然不到「2147483647」的一半。所以在內部,我必須使用Long或Guava的UnsignedInteger。
要寫入該格式中,字節數組長度需要4,其適合整數得很好,但長期轉換爲字節陣列需要長度8.
的陣列如何可以轉換一個長或UnsignedInteger將最大值「4294967295」表示爲4字節數組?
我正在寫入具有uint32的存儲格式,允許的最大值爲「4294967295」。Java uint32(存儲爲long)到4字節數組
Java中的整數當然不到「2147483647」的一半。所以在內部,我必須使用Long或Guava的UnsignedInteger。
要寫入該格式中,字節數組長度需要4,其適合整數得很好,但長期轉換爲字節陣列需要長度8.
的陣列如何可以轉換一個長或UnsignedInteger將最大值「4294967295」表示爲4字節數組?
只需將它轉換爲8字節數組,然後只需要在最後4個字節:
public static byte[] fromUnsignedInt(long value)
{
byte[] bytes = new byte[8];
ByteBuffer.wrap(bytes).putLong(value);
return Arrays.copyOfRange(bytes, 4, 8);
}
要扭轉這一點,你可以用下面的方法:
public static long toUnsignedInt(byte[] bytes)
{
ByteBuffer buffer = ByteBuffer.allocate(8).put(new byte[]{0, 0, 0, 0}).put(bytes);
buffer.position(0);
return buffer.getLong();
}
注意,這種方法可以採取一個負值長或長超過unsigned int的範圍,並且在這種情況下不會拋出異常!
您可以只將其轉換爲int
,做任何你做,輪流int
s轉換陣列,像這樣的:(未測試)
public static byte[] getUnsignedInt(long value)
{
byte[] bytes = new byte[4];
ByteBuffer.wrap(bytes).putInt((int)value);
return bytes;
}
當然,如果你在一個把這些東西無論如何,你不妨直接做這件事。
如果你只是在存儲它,那麼最高位的「含義」或「解釋」是無關緊要的。例如,4294967295將被解釋爲-1,但它的確是相同的數字:0xFFFFFFFF,十六進制,因此您將得到字節數組{ 0xFF, 0xFF, 0xFF, 0xFF }
。
扭轉它,你可以做這樣的事情(未測試)
public static long toUnsignedInt(byte[] bytes)
{
ByteBuffer buffer = ByteBuffer.allocate(4).put(bytes);
buffer.position(0);
return buffer.getInt() & 0xFFFFFFFFL;
}
沒有對象的創建和複製數組接受的答案的答案......這是容易做到的自己W /移位操作。請參閱:
import java.io.*;
public class TestUINT32 {
public static void writeLongAsUINT32(long value, OutputStream os) throws IOException {
for (int i=0; i<4; ++i) {
os.write((byte) value);
value = value >> 8;
}
}
public static void main(String[] args) throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream();
long value = 0xFFEEDDBB;
writeLongAsUINT32(value, os);
byte[] ba = os.toByteArray();
for (int i=ba.length; i>0; --i) {
System.out.print(String.format("%02X", ba[i-1]));
}
System.out.println();
}
}
實例運行:
$ java TestUINT32
FFEEDDBB
這不起作用,因爲INT有一個2147483647最大值,而無符號整數有不止一個最大值的兩倍。將long向下投影到int將丟失超過max int值的任何內容。 – user2887053
@ user2887053不,它不。 'int'將是負數,但這不重要。 – harold