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

时间:2016-03-19 06:43:57

标签: 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中的原始长值是什么,大小都将变为0!

如果我不进行ntohl()转换,那么对于s = 1,size = 72057594037927936

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

1 个答案:

答案 0 :(得分:2)

值0x57594037927936为十六进制的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);

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