当在网络字节顺序中放置双精度时,为什么它是在 4 字节块中完成的
When putting a double in network byte order, why is it done in 4 byte chunks?
在大端序和小端序之间转换网络数据时,我的理解是交换构成该类型的所有字节。 无论类型的大小如何,我们都会交换它们,以便第一个字节成为最后一个字节,最后一个字节成为第一个字节。
这通常可以用下面的函数来表示:
void SwapBytes(void *pv, size_t n)
{
char *p = pv;
size_t lo, hi;
for(lo=0, hi=n-1; hi>lo; lo++, hi--)
{
char tmp=p[lo];
p[lo] = p[hi];
p[hi] = tmp;
}
}
不顾效率,
我曾希望这适用于任何数据类型 - 包括IEEE 754双精度。
然后,我遇到了以下帖子,
其中,用户在 4 字节块中交换了双精度的字节:
void send_double(double d) {
long int i64 = *((reinterpret_cast<int *>)(&d)); /* Ugly, but works */
int hiword = htonl(static_cast<int>(i64 >> 32));
send(hiword);
int loword = htonl(static_cast<int>(i64));
send(loword);
}
double recv_double() {
int hiword = ntohl(recv_int());
int loword = ntohl(recv_int());
long int i64 = (((static_cast<long int>) hiword) << 32) | loword;
return *((reinterpret_cast<double *>(&i64));
}
在网络字节顺序方面是否有特殊规则?
起初,我认为这是一次交换 4 个字节,无论类型如何,但这对于只有 2 个字节的 uint16 来说没有意义。
将 IEEE 754 双精度转换为网络字节顺序的正确方法是什么?
我是翻转所有 8 个字节,还是单独翻转每半字节?
将 IEEE 754 双精度转换为网络字节顺序的正确方法是什么?
据我所知,IEEE754双精度没有标准的网络字节顺序。 显然,人们已经推出了自己的序列化。
"网络字节顺序"最初是在互联网协议的背景下产生的,在互联网协议中,发送32位值(IPv4地址)和16位值(例如端口号)是很常见的。RFC 1700 最初定义了该术语,但该 RFC 现已过时,无法替代。
<小时 />对于double
或任何其他数据的通信,双方应同意并遵循协议规范。这将说明双精度是如何编码的。 您链接到的帖子可能遵循了一个协议,该协议指定将IEEE754 64 位格式的字节按他显示的特定顺序放置。 其他协议可能有所不同。
相关文章:
- 当比特(而不是字节)的顺序至关重要时的持久性
- 将浮点类型转换为两个短字节(高字节和低字节)
- 我应该考虑网络字节订单吗?
- Java字节与C 字节
- 将网络字节顺序(大字节序)转换为小字节序
- 将主机字节顺序转换为网络字节顺序有时会导致奇怪的结果
- 位图应该是 2 字节还是 4 字节对齐
- 当在网络字节顺序中放置双精度时,为什么它是在 4 字节块中完成的
- 将文件从客户端传输到服务器时缺少字节,字节值也表示一些控制字符
- 如何连接到 sock4 客户端的网络字节地址?
- 在wchar_t和网络字节之间进行转换
- 一个字节一个字节地读取文件,会产生损坏的数据
- 为具有1字节和2字节字符的字符集实现退格
- c++ 11中类型的字节对字节拷贝
- 如何编写(可移植的)反向网络字节顺序
- 如何获取Windows C++中进程(输入:进程ID或句柄)的每秒接收和发送网络字节数?
- 网络字节顺序和字节序问题
- UDP 传输和维护网络字节顺序
- c++从字符串化字节转换字节数组
- C / c++ -如何一个字节一个字节地从网上下载(像文件流一样)