[英]Send uint32_t from C++ to Java
我目前正在用C ++和Android应用编写服务器,并使用google protobuf从中接收数据。 目前,我以大小来构图数据,所以基本上我发送
-----------------------------------------------------
| payload size (4byte, unsigned) | protobuf payload |
-----------------------------------------------------
我对Java中的内容进行反序列化没有问题,但是如何将字节从套接字转换为无符号整数? payload size
始终是uint32_t
,已使用htonl
将其转换为网络字节顺序。 因此,Java需要转换为主机字节顺序并将其转换为Integer。
好的,因此,在Java中,整数始终为32位,因此您只需要读取这四个字节,然后使用ByteBuffer
将其转换为整数即可。 您可能会认为我们需要指定字节顺序,但是事实证明ByteBuffers
默认以大端顺序读取字节,因此已经可以用于网络顺序:
byte[] bytes = ...;
int size = ByteBuffer.wrap(bytes).getInt();
但是,由于Java中的所有整数都是带符号的,因此如果它太大,则上述size
可能最终为负。 您可能不想要那样。 您可以将其强制转换为long,但是如果int为负,则其符号将被扩展,最终您将得到负long。
解决方案是将其解释为long,即使它是有符号的,它也是64位,因此足够大以表示32位无符号整数。 幸运的是,Java 8中有一个方法可以做到这一点:
long actualSize = Integer.toUnsignedLong(size);
随您去,现在您可以玩大号了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.