Java 从C&x2B发送uint32+;到爪哇 我目前正在用C++编写服务器,Android应用程序使用谷歌原型Bufff来修改数据。目前我用大小来框定数据,所以基本上我发送 ----------------------------------------------------- | payload size (4byte, unsigned) | protobuf payload | -----------------------------------------------------

Java 从C&x2B发送uint32+;到爪哇 我目前正在用C++编写服务器,Android应用程序使用谷歌原型Bufff来修改数据。目前我用大小来框定数据,所以基本上我发送 ----------------------------------------------------- | payload size (4byte, unsigned) | protobuf payload | -----------------------------------------------------,java,c++,Java,C++,在Java中反序列化这些内容没有问题,但是如何将套接字中的字节转换为无符号整数呢?有效负载大小始终是一个uint32\u t,已使用htonl转换为网络字节顺序。所以Java需要转换为主机字节顺序并将其转换为整数。好的,所以在Java中,int总是32位,所以您只需要读取这四个字节,然后使用ByteBuffer将其转换为int。您可能认为我们需要指定字节顺序,但事实证明,ByteBuffers在默认情况下以大端顺序读取字节,因此这已经适用于网络顺序: byte[] bytes = ...; in

在Java中反序列化这些内容没有问题,但是如何将套接字中的字节转换为无符号整数呢?
有效负载大小始终是一个
uint32\u t
,已使用
htonl
转换为网络字节顺序。所以Java需要转换为主机字节顺序并将其转换为整数。

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

byte[] bytes = ...;
int size = ByteBuffer.wrap(bytes).getInt();
然而,由于Java中的所有整数都是有符号的,因此如果上面的
size
太大,则可能会以负数结束。你可能不想那样。您可以将其强制转换为long,但如果int为负数,则其符号将被扩展,最终将得到负long

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

long actualSize = Integer.toUnsignedLong(size);

好了,现在你可以玩大小了。

可能是@EtienDemartel的重复它不是直接的重复,因为我首先还需要知道如何将字节转换为uint32\u t。Java int已经是32位了,就是这样。@EtienDemartel,它们是有符号的还是无符号的?那么如何从字节数组中获取int呢?@Nidhoegger在Java中,int总是有符号的,非常感谢