代码之家  ›  专栏  ›  技术社区  ›  Nidhoegger

从C++到Java发送UIT32

  •  0
  • Nidhoegger  · 技术社区  · 6 年前

    我现在正在用C++编写一个服务器和一个Android应用程序,它使用谷歌原型Bufff来修改数据。目前我把数据和大小框起来,所以基本上我发送

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

    我在Java中不需要反序列化这些东西,但是如何将字节从套接字转换成无符号整数呢?这个 payload size 永远是 uint32_t 已转换为 htonl 网络字节顺序。因此,Java需要转换为主机字节顺序并将其转换成整数。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Etienne de Martel    6 年前

    好的,在Java中,INT总是32位,所以你只需要读取这四个字节并将其转换成int使用 ByteBuffer . 您可能认为我们需要指定字节顺序,但事实证明 ByteBuffers 默认情况下按big-endian顺序读取字节,这样就可以按网络顺序工作了:

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

    但是,因为Java中的所有整数都被签名,然后 size 如果太大的话,上面可能会变成负数。你可能不想那样。你可以将它强制转换为long,但是如果int为负数,它的符号将被扩展,最后得到一个负数long。

    解决办法是 解释 它是一个长的,即使有符号,也是64位的,因此大到可以表示32位无符号整数。谢天谢地,Java 8中有一个方法就是这样:

    long actualSize = Integer.toUnsignedLong(size);
    

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