【问题标题】:Converting raw-byte values into Java types将原始字节值转换为 Java 类型
【发布时间】:2011-01-16 21:20:09
【问题描述】:

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

当然,它会给出不同的结果。哪一个是正确的?您能否也给我一个有效的示例,但是对于 unsigned long 怎么做?

提前谢谢你!

【问题讨论】:

    标签: java byte ushort ulong


    【解决方案1】:

    前段时间我不得不做一些类似的工作,我发现做这种工作的最好方法是使用ByteBuffer及其转换为DoubleBufferLongBuffer等。你可以通过调用将字节数组转换为ByteBuffer

    ByteBuffer myBuffer = ByteBuffer.wrap(myRawArray);
    

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

    IntBuffer myIntBuffer = myBuffer.asIntBuffer();
    

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

    int nextInt = myIntBuffer.get();
    

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

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

    【讨论】:

    • Int/Double/LongBuffer 的问题在于,如果整个消息都包含这些数据类型,它们的效果最好。如果您有混合/未对齐的类型,最好使用 ByteBuffer。
    • 好点。我认为它仍然值得一提,因为它可能在这里有用。
    【解决方案2】:

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

    ByteBuffer b = ByteBuffer.wrap(bytes);
    short s = b.getShort();
    long l = b.getLong();
    

    【讨论】:

    • 您也可以使用DatagramChannel,它直接读入ByteBuffer(无需包装数组。)
    【解决方案3】:

    这个真的晚了。

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

    return (b1 << 8) + b0;//little endian
    return (b0 << 8) + b1;//big endian
    

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 2013-07-17
      • 2012-07-14
      • 2021-06-16
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      相关资源
      最近更新 更多