2013-02-12 69 views
17

Tôi có mảng byte trong đó dữ liệu trong mảng thực sự là dữ liệu ngắn. Các byte được sắp xếp trong little endian:Chuyển đổi giá trị mảng byte theo thứ tự cuối nhỏ thành giá trị ngắn

3, 1, -48, 0, -15, 0, 36, 1

nào khi chuyển đổi sang kết quả giá trị ngắn trong:

259, 208, 241, 292

Có cách nào đơn giản trong Java để chuyển đổi các giá trị byte thành giá trị ngắn tương ứng của chúng? Tôi có thể viết một vòng lặp mà chỉ mất mỗi byte cao và thay đổi nó bằng 8 bit và OR nó với byte thấp của nó, nhưng có một hit hiệu suất.

+2

Bạn đã đưa 8 byte, và sau đó 4 lần ... trong khi 8 byte chỉ nên dẫn đến giá trị dài * duy nhất *. Ngoài ra, bạn đã không nói những gì bạn mong đợi. Về cơ bản câu hỏi của bạn là rất không rõ ràng tại thời điểm này ... –

+1

Không, nó không phải là không rõ ràng. Bạn có dữ liệu từ mảng byte và những gì nó chuyển đổi thành. Không thể rõ ràng hơn thế. – AndroidDev

+8

Có, nó có thể. Bởi vì nó có vẻ như bạn đang * thực sự * chuyển đổi thành 'short', không phải' long' ... và bạn đã không nói những gì bạn mong đợi * kết quả được. Cảm thấy tự do không làm cho câu hỏi trở nên rõ ràng hơn - nhưng hãy nhớ rằng bạn là người đang tìm kiếm sự giúp đỡ và câu hỏi của bạn càng tốt thì sự trợ giúp càng tốt. –

Trả lời

38

Với java.nio.ByteBuffer bạn có thể chỉ định độ tin cậy bạn muốn: order().

ByteBuffer có phương pháp để trích xuất dữ liệu như byte, char, getShort(), getInt(), dài, đôi ...

Dưới đây là một ví dụ làm thế nào để sử dụng nó:

ByteBuffer bb = ByteBuffer.wrap(byteArray); 
bb.order(ByteOrder.LITTLE_ENDIAN); 
while(bb.hasRemaining()) { 
    short v = bb.getShort(); 
    /* Do something with v... */ 
} 
+1

Cảm ơn. Giúp rất nhiều. Vui mừng khi thấy ai đó có thể dễ dàng hiểu được câu hỏi trong tầm tay. Cảm ơn rất nhiều. – AndroidDev

+1

(Chỉ cần không mong đợi 'getLong()' để chuyển đổi * hai * byte theo dữ liệu mẫu trong câu hỏi. Bạn muốn gọi 'getShort()' cho điều đó.) –

+0

Thực ra, tôi muốn getShort cung cấp cho tôi kết quả. Tuy nhiên, giải pháp của bạn là chính xác. – AndroidDev

0
/* Try this: */ 
public static short byteArrayToShortLE(final byte[] b, final int offset) 
{ 
     short value = 0; 
     for (int i = 0; i < 2; i++) 
     { 
      value |= (b[i + offset] & 0x000000FF) << (i * 8); 
     }    

     return value; 
} 

/* if you prefer... */ 
public static int byteArrayToIntLE(final byte[] b, final int offset) 
{ 
     int value = 0; 

     for (int i = 0; i < 4; i++) 
     { 
      value |= ((int)b[i + offset] & 0x000000FF) << (i * 8); 
     } 

     return value; 
} 
Các vấn đề liên quan