2012-08-22 47 views
2

IAM从c.dot网的Web服务越来越转换字节[]为长黑莓

byte[] data = new byte[] {-33, -96,0, 0, 0,0,0,0}; 

我想这个转换为长期价值 我想这

long result = (long)ByteBuffer.wrap(index).getInt(); 

我得到结果为-543162368其实际值为41183

回答

1

首先你想要t o在缓冲区上调用getLong()而不是getInt()

但是,您收到的数据是little-endian,这意味着它首先从低位字节开始。 ByteBuffers被构造为具有大端顺序的默认值。您需要将订单设置为LITTLE_ENDIAN以获取正确的值。

ByteBuffer buffer = ByteBuffer.wrap(index) 
buffer.order(ByteOrder.LITTLE_ENDIAN); 
long result = buffer.getLong(); 

既然你显然不能设置的字节顺序或使用getLong,你需要做的是这样的:

// Reverse array 
for (int i = 0; i < 4; ++i) 
{ 
    byte temp = data[i]; 
    data[i] = data[8-i]; 
    data[8-i] = temp; 
} 

// Get two ints and shift the first int into the high order bytes 
// of the result. 
ByteBuffer buffer = ByteBuffer.wrap(data); 
long result = ((long)buffer.getInt()) << 32; 
result |= (long)buffer.getInt(); 

result现在应该包含的值。

+0

但黑莓手机不支持getLong(),黑莓手机也不支持ByteOrder – user1203673

+1

手动反转该数组,然后调用get int两次,将第一个结果强制转换为long并将其移动32位,并将其与第二次通话的结果。 – Dervall

+0

我按照你建议的先生德沃尔,但亚姆得到的结果为零,但我试过这样,并得到结果长l = 0; (int i = 0; i <8; i ++){ \t \t \t \t \t L^=(长)字节[I] & 0xff; \t \t} \t \t返回升; – user1203673