当前位置: 技术问答>linux和unix
结构体和网络字节序问题
来源: 互联网 发布时间:2015-11-23
本文导语: typedef struct STag{ char a0; char aa[4]; unsigned short a1; unsigned short b; unsigned short c; int d; float e; double f; char *g; int *h; }S; linux下, 上面这个结构要通过网...
typedef struct STag{
char a0;
char aa[4];
unsigned short a1;
unsigned short b;
unsigned short c;
int d;
float e;
double f;
char *g;
int *h;
}S;
linux下,
上面这个结构要通过网络传输出去,问如何处理结构填充空洞和网络字节序。
如果哪位 高手能写出大致的伪代码 ?
3x
char a0;
char aa[4];
unsigned short a1;
unsigned short b;
unsigned short c;
int d;
float e;
double f;
char *g;
int *h;
}S;
linux下,
上面这个结构要通过网络传输出去,问如何处理结构填充空洞和网络字节序。
如果哪位 高手能写出大致的伪代码 ?
3x
|
呵呵,怎么搜的?google htonf
|
如果你的所有机器的系统都是一样的,也就是肯定没有字节序不一致的情况,可以不考虑字节序的问题(比如如果都是x86体系,就不用考虑)。否则就需要对每个结构成员调用htonl或者ntohl函数在网络字节和本地字节之间转换。
|
1.用紧凑格式的结构体定义
2.将每个非char类型的成员取出后转成网络字节序然后再发送出去
3.接收到之后将先存临时的结构体中,将所有非CHAR类型的成员转换成本地字节序
只要是一个字节以上的数据结构,都存在字节序的问题,为了简化处理,有一个笨办法,就是将每个非char类型的成员拷到临时变量中,然后再取这个变量地址,如果是PC机,也就是小端字节序,网络是大端字节序,只需操作这个内存地址,将这个内存地址中的数据按char类型调个头,就OK了,接收端在收到后就执行相反的操作,这就是人为地进行字节序转换,无论是整型,浮点型还是其它类型的转换过程都是一样
2.将每个非char类型的成员取出后转成网络字节序然后再发送出去
3.接收到之后将先存临时的结构体中,将所有非CHAR类型的成员转换成本地字节序
只要是一个字节以上的数据结构,都存在字节序的问题,为了简化处理,有一个笨办法,就是将每个非char类型的成员拷到临时变量中,然后再取这个变量地址,如果是PC机,也就是小端字节序,网络是大端字节序,只需操作这个内存地址,将这个内存地址中的数据按char类型调个头,就OK了,接收端在收到后就执行相反的操作,这就是人为地进行字节序转换,无论是整型,浮点型还是其它类型的转换过程都是一样
|
你可以把char和short都换成int,就可以对齐了。或者char后面加上一个char reserved[3]凑齐4字节。
|
* 如果没有对齐,在发送的时候会不会把空洞里面的数据发出去呢?
===
会。send不区分结构,只是当作字节流。
* 浮点型呢怎么办?
===
也需要转换。到网上搜一下,有转换函数库。
===
会。send不区分结构,只是当作字节流。
* 浮点型呢怎么办?
===
也需要转换。到网上搜一下,有转换函数库。
|
浮点数的格式虽然有IEEE标准,但不是大家都用。