有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将rawbyte值转换为Java类型

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

例如,我想将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) 个答案

  1. # 1 楼答案

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

    ByteBuffer b = ByteBuffer.wrap(bytes);
    short s = b.getShort();
    long l = b.getLong();
    
  2. # 2 楼答案

    不久前我不得不做一些类似的工作,我发现做这类工作的最好方法是使用ByteBuffer及其到DoubleBufferLongBuffer的转换,等等。您可以通过调用

    ByteBuffer myBuffer = ByteBuffer.wrap(myRawArray);
    

    从那里,您可以通过调用

    IntBuffer myIntBuffer = myBuffer.asIntBuffer();
    

    然后您可以通过调用

    int nextInt = myIntBuffer.get();
    

    这些类还支持批量get操作,因此如果您知道通过网络接收到大量相同类型的数据,您可以非常快速地进行转换

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

  3. # 3 楼答案

    这次真的很晚了

    根据数据的长度,两者都是正确的。请参见此处:http://en.wikipedia.org/wiki/Endianness

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