java - 在 C++ 中将 Java long 转换为 int64

标签 java c++ int type-conversion long-integer

我正在通过 C++ 服务器上的套接字连接从 Java 客户端接收一些数字数据。当我收到 4 字节的 int 类型数据时,我需要的只是使用 ntohl() 函数或反转位顺序转换为 c++ int 类型。但是,我在尝试从 Java 转换长数据类型时遇到了问题。无论我尝试什么,我都无法恢复正确的值。我也使用了 LONG64、ULONG64 和 int64_t,但都没有用。

例如,当我从 Java 发送 long s = 1 时,在 C++ 端我做了:

int64_t size;
recv(client, (char *)&size, sizeof int64_t, 0);

如果我这样做

size = ntohl(size)

那么不管Java中原来的long值是什么,size都会变成0!

如果我不做 ntohl() 转换,那么 size = 72057594037927936 for s = 1

我几乎没有找到关于这个主题的任何有用信息,如果有任何建议,我将不胜感激。

最佳答案

值 72057594037927936 在十六进制中是 0x0100000000000000。正如您可能已经猜到的那样,这只是向后的字节排序,1 在前面而不是后面。

ntohl() 是 32 位的,所以它会丢弃前四个字节(前 8 个十六进制数字),给你零。您可以改用 htonll,但这不太正确。最好的办法是自己反转字节的顺序。

int64_t size;
recv(client, (char *)&size, sizeof int64_t, 0);
char *start = (char *)&size, *end = start + sizeof(size);
std::reverse(start, end);

一般来说,有很多方法可以反转字节,也有很多方法可以处理小端/大端问题。

关于java - 在 C++ 中将 Java long 转换为 int64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36098743/

相关文章:

java - Firebase 管理 SDK : unable to find valid certification path to requested target

c++ - 我如何在 visual studio 2017 中启动新的 cocos2d-x-3.17 android 游戏项目?

c++关闭用mmap读取的open()文件

转换为无符号整数,然后转换回来,C

java - 如何在 Android 应用程序中的屏幕之间交换文本

java - JDBC Connection对象在静态 block 执行后自动关闭以及如何模块化代码

c - double 到 int 的转换在 c 中使用 math.h 函数不起作用

C - 将字符串输入到 int 变量中?

java - 当从 servlet 使用 sendError 时,tomcat 不显示错误消息

c++ - 并行插入排序、幼稚尝试、使用 pthread 尝试失败、线程未并行排序,但与串行一起工作正常