将UINT32_T从C 发送到Java
Send uint32_t from C++ to Java
我当前正在使用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);
您去了,现在您可以玩大小。
相关文章:
- 在java中解决这段代码时面临循环中的问题
- 尝试用java代码编译和运行c++代码
- 在这种情况下,java对象是否可以调用本机函数
- 在java中读取c++字节的位字段
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 使用已使用 java 编码的 openssl 解码数据
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- Android Java USB for native cpp
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- C++ equivalent to Java Map getOrDefault?
- C++ 中的 Java 样式枚举
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 加密在 Windows、C++ 和 Java 中传输中的数据
- Java从C++回调到C++回调
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 用C++包装 Java 库 (JNI)
- 使用 TreeSet Java 对反转进行计数
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 如何通过 JNI 将 C 字符串表情符号传递给 Java
- 如何从保存在 Java 中C++的字节数组中读取数字?