繁体   English   中英

从C ++发送uint32_t到Java

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM