在大端和小端之间转换网络数据时,我的理解是我们交换了构成该类型的所有字节。无论类型的大小如何,我们都要交换它们,以便第一个字节成为最后一个字节,最后一个字节成为第一个字节。
这通常可以用以下函数表示:
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双打。
然后,我遇到了following post,
用户在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个字节,还是单独翻转每个字节?
答案 0 :(得分:1)