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

例如,我想将16位未签名的简短转换为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;

当然,它给出了不同的结果。哪一个是正确的?您还能给我一个有效的例子,如何做同样的事情,但对于未签名的长时间?

先感谢您!

有帮助吗?

解决方案

您可以使用datainputstream或bytebuffer读取各种类型。您可以将符号类型用作大多数操作的无符号值。我写了一个简单的课程,以说明如何使用签名类型,就好像它们没有签名一样 未签名

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

其他提示

我不得不做一些与此类似的工作,我发现做这种工作的最好方法是使用 ByteBuffer 及其转换为 DoubleBuffer, LongBuffer, 等等。您可以将一个字节数组转换为 ByteBuffer 通过打电话

ByteBuffer myBuffer = ByteBuffer.wrap(myRawArray);

从那里,您可以将字节视为列表 int通过打电话

IntBuffer myIntBuffer = myBuffer.asIntBuffer();

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

int nextInt = myIntBuffer.get();

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

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

真的很晚。

两者都是根据数据的端口正确的。看这里: http://en.wikipedia.org/wiki/endianness

return (b1 << 8) + b0;//little endian
return (b0 << 8) + b1;//big endian
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top