2

我在将原始字节值转换为 java 类型时遇到问题。我通过数据报套接字接收字节作为字节数组。我确切地知道哪些字节意味着什么,但我不知道如何适当地转换它们(我的意思是我知道偏移量,但不知道我认为我收到的内容是否正确;))。

例如,我想将 16 位 unsigned 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;

当然,它会给出不同的结果。哪一个是正确的?您能否也给我一个有效的示例,但是对于无符号长整数如何做同样的事情?

先感谢您!

4

3 回答 3

3

不久前我不得不做一些与此类似的工作,我发现完成此类工作的最佳方法是使用ByteBuffer并将其转换为DoubleBuffer,等。您可以通过调用LongBuffer将字节数组转换为 aByteBuffer

ByteBuffer myBuffer = ByteBuffer.wrap(myRawArray);

从那里,您可以int通过调用以 s列表的形式查看字节视图

IntBuffer myIntBuffer = myBuffer.asIntBuffer();

然后您可以通过调用转换字节

int nextInt = myIntBuffer.get();

这些类还对批量获取操作有很多支持,因此如果您知道您正在通过网络接收一大堆相同类型的数据,您可以非常快速地进行转换。

如果可能的话,另一种方法是使用某种基于 Java 的序列化通过网络发送数据。这使您可以使用流编写器类更轻松地进行转换。当然,这可能不可用,尤其是在与非 Java 服务器通信时,但它可能值得探索。

于 2011-01-16T21:30:38.817 回答
1

您可以使用 DataInputStream 或 ByteBuffer 来读取各种类型。对于大多数操作,您可以将有符号类型用作无符号值。我编写了一个简单的类来说明如何使用带符号的类型,就好像它们是无符号的Unsigned

ByteBuffer b = ByteBuffer.wrap(bytes);
short s = b.getShort();
long l = b.getLong();
于 2011-01-16T21:31:25.060 回答
1

这个真的晚了。

根据数据的字节序,两者都是正确的。见这里:http ://en.wikipedia.org/wiki/Endianness

return (b1 << 8) + b0;//little endian
return (b0 << 8) + b1;//big endian
于 2012-04-17T16:45:27.487 回答