题
我在将原始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
不隶属于 StackOverflow