我正在进行小端序和大端序之间的转换,并检查是否正确,请帮忙确认。
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
double dx = 122992001003000;
//A method little to big endian
double bEndian(double d) {
int *p0 = (int *) &d;
int *p1 = p0 + 1;
printf("1: %x %x\n", *p0, *p1);
int tmp = *p1;
*p1 = htonl(*p0);
*p0 = htonl(tmp);
printf("2: %x %x\n", *p0, *p1);
return *(double *)p0;
}
//A method big to little endian
double lEndian(double d) {
int *p0 = (int *) &d;
int *p1 = p0 + 1;
printf("3: %x %x\n", *p0, *p1);
int tmp = *p1;
*p1 = ntohl(*p0);
*p0 = ntohl(tmp);
printf("4: %x %x\n", *p0, *p1);
return *(double *)p0;
}
int main (int argc, char *argv[])
{
double d1 = bEndian(dx);
double d2 = lEndian(d1);
printf("5: %.0f\n", d2);
if ((*(double*) &d2) == dx)
printf("6: %.0lf\n", *(double*) &d2);
else
printf("7:%d\n", d2);
return 0;
}
为什么有时候它会给我返回122992001003129这样的结果?此外,使用ntohl或htonl没有区别吗?这只是为了规范化即网络到主机和主机到网络吗?
dx
的值,它是正确的吗? - undefinedntoh
和hton
只是交换字节的顺序(在大多数机器上,对于大端字节序的机器它们不起作用),所以是为了清晰起见使用不同的名称,但它们实际上是相同的。 - undefinedstruct netDouble { unsigned char bytes[sizeof(double)]; };
。 - undefined