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

3
我正在通过C++服务器的套接字连接从Java客户端接收一些数值数据。当我接收到4字节int类型数据时,我只需要使用ntohl()函数或倒转位顺序来转换为c ++ int类型。然而,我尝试将长数据类型从Java转换为C++时遇到了问题。无论我尝试什么,都无法恢复正确的值。我也尝试使用LONG64、ULONG64和int64_t,但都没有成功。
例如,当我从Java发送long s = 1时,在C++端我做了:
int64_t size;
recv(client, (char *)&size, sizeof int64_t, 0);

如果我这样做:
size = ntohl(size)

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

如果我不进行ntohl()转换,则当s = 1时,size = 72057594037927936

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


仅为澄清,一个4字节的int类型数据在哪种架构下占用了64位?我最近检查过,4个字节几乎总是4个八位组=32位。你知道你可以始终将它们读入一个int8_t ar [n]中,并实际验证读取的字节数并验证它们在序列中的位置。验证recv的返回结果也不会有坏处。 - WhozCraig
Java与C和C++不同,它不关心字节序;它总是大端字节序。这难道不是你问题的根源吗? - fge
感谢您的建议。正如Rob在答案中所说,问题在于ntohl()函数本身,它操作32位数据。 - Vitt Volt
1个回答

2

数值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);

有很多方法可以反转字节,而且通常也有很多处理小/大端问题的方法。


清晰明了。非常感谢您,先生! - Vitt Volt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接