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

Convert Java long to int64 in C++

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

例如,当我从 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);

通常有很多方法可以反转字节,也有很多方法可以处理 little/big 端序问题。