我将原始字节值转换为java类型时遇到问题。我通过数据报套接字接收字节作为字节数组。我确切地知道哪些字节意味着什么,但我不知道如何恰当地转换它们(我的意思是我知道偏移,但不知道我认为我收到的是否正确;))。
例如,我想将16位无符号short转换为java int类型。我在网上找到了一些例子,一个是:
public int getUShort(byte[] bytes, int offset) {
int b0 = bytes[offset] & oxFF;
int b1 = bytes[offset + 1] & oxFF;
return (b1 << 8) + (b0 << 0);
另一个是相同的,但最后一行是:
return (b0 << 8) + b1;
当然它会给出不同的结果。哪一个是正确的?你能否给我一个有效的例子,如何做同样的事情,但是对于无签名的长期?
提前谢谢!
答案 0 :(得分:3)
我不得不做一些类似于此的工作,我发现执行此类工作的最佳方法是使用ByteBuffer
及其转换为DoubleBuffer
,{{1}你可以通过调用
LongBuffer
ByteBuffer
从那里,你可以通过调用
获得ByteBuffer myBuffer = ByteBuffer.wrap(myRawArray);
列表的字节视图
int
然后您可以通过调用
来转换字节IntBuffer myIntBuffer = myBuffer.asIntBuffer();
这些类还对批量获取操作提供了大量支持,因此如果您知道通过网络收到相同类型的大量数据,则可以非常快速地完成转换。
如果可能的话,另一种方法是使用某种基于Java的序列化来通过网络发送数据。这使您可以使用流编写器类更轻松地进行转换。当然,这可能不可用,特别是如果您正在与非Java服务器通信,但它可能值得探索。
答案 1 :(得分:1)
您可以使用DataInputStream或ByteBuffer来读取各种类型。您可以将签名类型用作大多数操作的无符号值。我编写了一个简单的类来说明如何使用签名类型,就好像它们是未签名的Unsigned
ByteBuffer b = ByteBuffer.wrap(bytes);
short s = b.getShort();
long l = b.getLong();
答案 2 :(得分:1)
这件事真的很晚。
两者都是正确的,基于数据的字节顺序。见这里:http://en.wikipedia.org/wiki/Endianness
return (b1 << 8) + b0;//little endian
return (b0 << 8) + b1;//big endian