【问题标题】:Send uint32_t from C++ to Java将 uint32_t 从 C++ 发送到 Java
【发布时间】:2018-12-18 06:07:09
【问题描述】:

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

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

我在 Java 中反序列化这些东西没有问题,但是如何将字节从套接字转换为无符号整数? payload size 始终是一个 uint32_t,它已使用 htonl 转换为网络字节顺序。所以Java需要转成主机字节序,再转成Integer。

【问题讨论】:

  • @EtiennedeMartel 它不是直接重复的,因为我首先还需要知道如何将字节转换为 uint32_t。
  • Java int 已经是 32 位了,就是这样。
  • @EtiennedeMartel 他们是签名的还是未签名的?以及如何从字节数组中获取 int?
  • @Nidhoegger in Java int 总是有符号的,

标签: java c++


【解决方案1】:

好的,所以,在 Java 中,整数总是 32 位,所以您只需读取这四个字节并使用 ByteBuffer 将其转换为整数。您可能认为我们需要指定字节顺序,但事实证明 ByteBuffers 默认以大端顺序读取字节,因此这已经适用于网络顺序:

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

但是,由于 Java 中的所有整数都是有符号的,所以如果上面的 size 太大,它最终可能会变成负数。你可能不想要那个。您可以将其强制转换为 long,但如果 int 为负数,则其符号将被扩展,您最终会得到一个负数。

解决方案是将其解释为 long,即使它是有符号的,它也是 64 位,因此大到足以表示 32 位无符号整数。值得庆幸的是,Java 8 中有一个方法可以做到这一点:

long actualSize = Integer.toUnsignedLong(size);

你去吧,现在你可以玩这个尺寸了。

【讨论】:

  • 非常感谢
猜你喜欢
  • 1970-01-01
  • 2012-04-25
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多