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

Convert Java long to int64 in C++

本文关键字:转换 int64 long Java C++ 中将      更新时间:2023-10-16

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

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

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

如果我这样做

size = ntohl(size)

然后大小将变为 0,无论 Java 中的原始长值是多少!

如果我不做 ntohl() 转换,那么 size = 72057594037927936 对于 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);

有很多反转字节的方法,以及处理小/大端序问题的大量方法。