double d =3490.15926535;send(s,&d,sizeofd,0);/* 危险,不具可移植性! */
接收者类似这样接收:
double d;recv(s,&d,sizeofd,0);/* 危险,不具可移植性! */
快速又简单,那有什麽不好的呢?
好的,事实证明不是全部的架构都能表示 double[或 int]。[嘿!或许你不需要可移植性,在这样的情况下这个方法很好,而且快速。]
当封装整数型别时,我们已经知道 htons() 这类的函数如何透过将数字转换为 Network Byte Order(网路字节顺序),来让东西可以移植。毫无疑问地,没有类似的函数可以供 float 型别使用,全部的希望都落空了吗?
别怕![你有担心了一会儿吗?没有吗?一点都没有吗?]
我们可以做件事情:我们可以将数据封装为接收者已知的二进制格式,让接收着可以在远端解压。
我所谓的 "已知的二进制格式"是什麽意思呢?
好的,我们已经看过了 htons() 范例了,不是吗?它将数字从 host 格式改变[或是 "编码"]为 Network Byte Order 格式;如果要反转[译码]这个数字,接收端会调用 ntohs()。
可是我不是才刚说过,没有这样的函数可供非整数型别使用吗?
是的,我说过。而且因为 C 语言并没有规范标准的方式来做,所以这有点麻烦[that a gratuitous pun there for you Python fans]。
要做的事情是将数据封装到已知的格式,并透过网路送出。例如:封装 float,这里的东西有很大的改善空间:[28]
#include <stdint.h>uint32_thtonf(floatf){uint32_t p;uint32_t sign;if(f <0){ sign =1; f =-f;}else{ sign =0;} p =((((uint32_t)f)&0x7fff)<<16)|(sign<<31);// whole part and sign p |=(uint32_t)(((f -(int)f)*65536.0f))&0xffff;// fractionreturn p;}floatntohf(uint32_tp){float f =((p>>16)&0x7fff);// whole part f +=(p&0xffff)/65536.0f;// fractionif(((p>>31)&0x1)==0x1){ f =-f;}// sign bit setreturn f;}