将原始字节值转换为Java类型

时间:2011-01-16 21:20:10

标签: java byte ushort ulong

我将原始字节值转换为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;

当然它会给出不同的结果。哪一个是正确的?你能否给我一个有效的例子,如何做同样的事情,但是对于无签名的长期?

提前谢谢!

3 个答案:

答案 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
相关问题