将UINT32_T从C 发送到Java

Send uint32_t from C++ to Java

本文关键字:Java UINT32      更新时间:2023-10-16

我当前正在使用C 和Android应用程序编写一台服务器,该应用程序使用Google Protobuf从其重新启用数据。目前,我用大小构架数据,因此我基本上发送了

-----------------------------------------------------
| payload size (4byte, unsigned) | protobuf payload |
-----------------------------------------------------

我没有问题将java中的东西挑选出来,但是如何将字节从插座转换为无符号整数?payload size始终是已通过htonl转换为网络字节顺序的uint32_t。因此,Java需要转换为host byte订单并将其转换为整数。

好吧,所以,在Java中,INT总是32位,因此您只需要读取这四个字节,然后使用ByteBuffer将其转换为INT。您可能认为我们需要指定字节顺序,但事实证明,默认情况下,ByteBuffers读取字节为Big Endian顺序,因此已经适用于网络顺序:

byte[] bytes = ...;
int size = ByteBuffer.wrap(bytes).getInt();

但是,由于Java中的所有整数都已签名,因此,如果它太大,上面的size可能会导致负面。您可能不想要那个。您可以将其施加长时间,但是如果INT为负,它的符号将被延长,最终会长时间长。

解决方案是解释它是长的,即使它签名为64位,因此足够大,可以代表一个32位未签名的整数。值得庆幸的是,Java 8中有一种方法可以做到这一点:

long actualSize = Integer.toUnsignedLong(size);

您去了,现在您可以玩大小。