2017-06-30 722 views
0

我正在寫入具有uint32的存儲格式,允許的最大值爲「4294967295」。Java uint32(存儲爲long)到4字節數組

Java中的整數當然不到「2147483647」的一半。所以在內部,我必須使用Long或Guava的UnsignedInteger。

要寫入該格式中,字節數組長度需要4,其適合整數得很好,但長期轉換爲字節陣列需要長度8.

的陣列如何可以轉換一個長或UnsignedInteger將最大值「4294967295」表示爲4字節數組?

回答

2

只需將它轉換爲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的範圍,並且在這種情況下不會拋出異常!

0

您可以只將其轉換爲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; 
} 
+0

這不起作用,因爲INT有一個2147483647最大值,而無符號整數有不止一個最大值的兩倍。將long向下投影到int將丟失超過max int值的任何內容。 – user2887053

+0

@ user2887053不,它不。 'int'將是負數,但這不重要。 – harold

1

沒有對象的創建和複製數組接受的答案的答案......這是容易做到的自己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