大端序与小端序

所谓的大端序与小端序,就是在数据表示的时候高位字节在前还是在后。采用大端序时,高位字节放在前面,即低地址中;而小端序的高位字节放在后面。比如对short int型变量4660,占据2个字节。其八进制为0x1234(00010010 00110100),采用大端序时,高位0x12放在前面,存放为0x12 0x34(左边为低地址);采用小端序时,低位字节0x34放在前面:0x34 0x12。 不同的机器可能采用不同的字节序,IP协议的网络字节序为大端序。在涉及到网络数据传输时,需要处理字节序的问题。比如IP包头中的目的地址和包长,必须要转换为网络字节序,否则不能正确传输。而要传输的数据也必须要进行转换,否则不同字节序的及其之间不能相互理解对方传来的数据。对于字节序的转换,可以自己编写程序实现,也可以采用系统提供的函数。LINUX系统提供如下的转换函数:

uint32_t htonl (unit32_t hostlong);

unit16_t htons (unit16_t hostshort);

unit32_t ntohl (unit32_t netlong); 

unit16_t ntohl (unit16_t netlong); 

 

函数名中h表示host,n表示network,l表示long,s表示short,至于to嘛,就是to了,呵呵。比如函数htonl的作用就是把本机的long int型数据转换为网络字节序。


#include<netinet/in.h>
#include<stdio.h>
#include<stdlib.h>


int main(){
        uint16_t host_short = 80;
        uint32_t host_long = 80;
        printf("network_short = %x\n", htons(host_short));
        printf("network_long = %lx\n", htonl(host_long));
        return 0;
}

NBO与HBO 

网络字节顺序NBO(Network Byte Order):按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。 
主机字节顺序(HBO,Host Byte Order):不同的机器HBO不相同,与CPU设计有关计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先。Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换。 

所以为了统一,发送多数据时,比如 unit16_t unit32_t 等数据时 必须先进行hton转换 htonl(),htons(),接受数据时,比如 unit16_t unit32_t 等数据时 必须先进行ntoh转换 ntohl(),ntohs(), 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值