当前位置: 技术问答>linux和unix
sun机器一个一块内存和windows机器上一块内存的高低位相反,请问如何互相转换?
来源: 互联网 发布时间:2015-09-21
本文导语: sun机器一个一块内存和windows机器上一块内存的高低位相反,请问如何互相转换? 要转换类型有 int short int 日期/时刻 字符串 bool 分不够再给.急 | 日期一般是按照s从某个固定时刻来算的,因...
sun机器一个一块内存和windows机器上一块内存的高低位相反,请问如何互相转换?
要转换类型有
int
short int
日期/时刻
字符串
bool
分不够再给.急
要转换类型有
int
short int
日期/时刻
字符串
bool
分不够再给.急
|
日期一般是按照s从某个固定时刻来算的,因为我没用过Solaris,估计这个东西未必是4字节的,因此用hton函数族不一定可以产生正确的行为。
另外,C里面并没有bool这个东西唉,C++里面实现这个似乎是和char一样的大小,这样的话和字节顺序没有什么关系吧?
另外,C里面并没有bool这个东西唉,C++里面实现这个似乎是和char一样的大小,这样的话和字节顺序没有什么关系吧?
|
不知道SUN的int是多少位的……
还有,这种东西最好用汇编来写,其他的都太没有效率了……
写一个C的实现
int i;
char* ptr=(char*)&i;
ptr[1]=ptr[2];
ptr[0]=ptr[3];
这样就完成了,i里面的字节顺序就已经被调换了……
还有,这种东西最好用汇编来写,其他的都太没有效率了……
写一个C的实现
int i;
char* ptr=(char*)&i;
ptr[1]=ptr[2];
ptr[0]=ptr[3];
这样就完成了,i里面的字节顺序就已经被调换了……
|
网络字节顺序是Big Endian的,即高位在前,低位在后,但是Windows目前运行的平台(Alpha可以两种都支持,不过似乎新的Windows发行版本已经没有Alpha的支持了……)似乎都是Little Endian的(主要是IA32),这个是低位在前,高位在后的……
转换到Big Endian的话,可以使用htons和htonl,但是转换到Little Endian的话,需要自己编写代码(可能是宏,也可能是嵌入式汇编,Sun的机器没完过,汇编上面就不好说了),另外,需要对不同长度的代码进行不同的转换才行。Sun的机器现在看到的大部分都是64位的了,你需要对16、32、64位不同的数据都进行转换才行(好像Sun的机器还实现了4倍精度的浮点数,也就是16字节128位的数据),都需要不同的代码,一般来说宏的效率高一点,inline函数不是很好处理……
转换到Big Endian的话,可以使用htons和htonl,但是转换到Little Endian的话,需要自己编写代码(可能是宏,也可能是嵌入式汇编,Sun的机器没完过,汇编上面就不好说了),另外,需要对不同长度的代码进行不同的转换才行。Sun的机器现在看到的大部分都是64位的了,你需要对16、32、64位不同的数据都进行转换才行(好像Sun的机器还实现了4倍精度的浮点数,也就是16字节128位的数据),都需要不同的代码,一般来说宏的效率高一点,inline函数不是很好处理……
|
htons
htonl
htonl