我正在通过 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/