在C++中将 Java long 转换为 int64
Convert Java long to int64 in C++
我通过服务器上的套接字连接从 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);
有很多反转字节的方法,以及处理小/大端序问题的大量方法。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 如何使用SSE有效地执行INT8/INT64转换
- 如何将 int64 定点转换为双精度
- 在C++中将 Java long 转换为 int64
- 初始化从无符号int64到无符号int的转换
- 当我试图转换Int64时,在poco库上发生了错误的转换异常