2012-03-24 54 views
8

Tôi có một byte [4] chứa số nguyên không dấu 32 bit (theo thứ tự lớn) và tôi cần chuyển đổi thành số nguyên dài (như int có thể 't giữ một số unsigned).Chuyển đổi số nguyên không dấu 32 bit (lớn cuối) thành dài và quay lại

Ngoài ra, làm cách nào để làm điều đó ngược lại (tức là từ lâu có chứa số nguyên không dấu 32 bit thành byte [4])?

+0

mảng byte đến từ đâu? – Raffaele

+0

@Raffaele từ một tệp – Aviram

Trả lời

12

Âm thanh như một tác phẩm dành cho ByteBuffer.

Hơi như

public static void main(String[] args) { 
    byte[] payload = toArray(-1991249); 
    int number = fromArray(payload); 
    System.out.println(number); 
} 

public static int fromArray(byte[] payload){ 
    ByteBuffer buffer = ByteBuffer.wrap(payload); 
    buffer.order(ByteOrder.BIG_ENDIAN); 
    return buffer.getInt(); 
} 

public static byte[] toArray(int value){ 
    ByteBuffer buffer = ByteBuffer.allocate(4); 
    buffer.order(ByteOrder.BIG_ENDIAN); 
    buffer.putInt(value); 
    buffer.flip(); 
    return buffer.array(); 
} 
+0

Sửa lỗi nếu tôi sai, nhưng nếu tôi thực hiện 'int value = buffer.getInt();' thì int có thể không chứa toàn bộ số (nếu nó chưa được ký và không được ký) . – Aviram

+0

@Aviram Một số nguyên trong Java là 32 bit (4 byte), miễn là ByteBuffer của bạn dài 4 byte, tôi không thấy lý do tại sao có vấn đề. Tôi đã cải thiện câu trả lời của tôi và tôi đã thử nghiệm nó với những mặt tích cực và tiêu cực và nó hoạt động tốt cho đến nay. Tôi có thể bỏ lỡ điều gì đó không? Nếu bạn có ý định sử dụng các số nguyên không dấu thì sử dụng longs và không phải số nguyên, bởi vì các số nguyên trong Java được ký. –

+3

Bạn có thể sử dụng 'return buffer.getInt() & 0xFFFFFFFFL;' vì bạn sẽ luôn nhận được giá trị chưa ký. ByteBuffer là BIG_ENDIAN theo mặc định. Bạn không cần phải gọi 'flip()' để sử dụng 'mảng()' –

8

Bạn có thể sử dụng ByteBuffer, hoặc bạn có thể làm điều đó theo cách cũ lỗi thời:

long result = 0x00FF & byteData[0]; 
result <<= 8; 
result += 0x00FF & byteData[1]; 
result <<= 8; 
result += 0x00FF & byteData[2]; 
result <<= 8; 
result += 0x00FF & byteData[3]; 
1

Ổi có các lớp hữu ích để đối phó với các giá trị số không dấu.

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/primitives/UnsignedInts.html#toLong(int)

+0

Điểm tốt, đó là quá mức chỉ bằng cách sử dụng phương pháp & 0xFFFFFFFFL được mô tả bởi Peter Lawrey cao hơn trong một bình luận của câu hỏi này. –

+0

Tại sao toLong (Integer.MIN_VALUE) không hoạt động? và trả về tiêu cực dài http://ideone.com/cERLo1 – gavioto

Các vấn đề liên quan