gpt4 book ai didi

java - 将 uint32_t 从 C++ 发送到 Java

转载 作者:行者123 更新时间:2023-11-28 04:27:55 24 4
gpt4 key购买 nike

我目前正在用 C++ 编写一个服务器和一个使用 google protobuf 从中接收数据的 Android 应用程序。目前我用大小来构建数据,所以基本上我发送

-----------------------------------------------------
| 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);

好了,现在您可以调整大小了。

关于java - 将 uint32_t 从 C++ 发送到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53820069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com