字节序问题

来源:互联网 发布:php api接口开发实例 编辑:程序博客网 时间:2024/06/14 01:40
  字节序由处理器决定,它分为两大阵营,一方以Intel为代表,其处理器的字节序是小尾端模式,即低地址存储数据的低位部分,高地址存储数据的高位部分;另一方以IBM为代表,其处理器的字节序是大尾端模式,即低地址存储数据的高位部分,高地址存储数据的低位部分。可用以下的简单代码测试CPU的大小端,小段输出0x78,大端0x12

#include <stdio.h>int main(){    int i = 0x12345678;    char *p = &i;    printf("%x\n", p);    return 0;}

  结构体的位域成员变量

  为了节省空间,如果结构体有几个成员变量的取值范围很小,那么可以考虑将它们合并在一个字节里或一个short、int变量里。使用一个类型超过一个字节的变量时,需要考虑字节序,那么在结构体中使用位域时,需不需要考虑bit序呢?即一个整形变量内包含多个位域变量,各变量的bit顺序是不是固定的呢?通过测试发现,各CPU体系结构的位域bit序跟其字节序大小端是一致的。

  

 网络字节序

  TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。如果主机是小端字节序,发送和接受都需要做转换。同理,32位的IP地址也要考虑网络字节序和主机字节序的问题。

  可用以下库函数做网络字节序和主机字节序的转换,使网络程序可移植:

#include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);uint16_t htons(uint16_t hostshort);uint32_t ntohl(uint32_t netlong);uint16_t ntohs(uint16_t netshort);

 

0 0
原创粉丝点击