网络字节序 大端 小端

1.小端法(Little-Endian)就是低位字节排放在内存的低地址端(即该值的起始地址),

高位字节排放在内存的高地址端;

2.大端法(Big-Endian)就是高位字节排放在内存的低地址端(即该值的起始地址),

低位字节排放在内存的高地址端;


        网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先

传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位

字节还是低位字节处理,是一个比较有意义的问题;

        UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送

端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值

在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应

的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,

字节数值在发送之前,在内存中应该是以大端法存放的;所以说,网络字节序是大端字节序;

         比如,我们经过网络发送整型数值0x12345678时,在80X86平台中,它是以小端发存放

的,在发送之前需要使用系统提供的字节序转换函数htonl()将其转换成大端法存放的数值。


          示例程序:

#include <stdio.h>
#include <netinet/in.h>
int main(int argc,char** argv)
{
  int num = 0x12345678;
  unsigned char* pc = (unsigned char*)(&num);
  printf("local order:\n");
  printf("[0]: 0x%X addr:%u\n", pc[0], &pc[0]);
  printf("[1]: 0x%X addr:%u\n", pc[1], &pc[1]);
  printf("[2]: 0x%X addr:%u\n", pc[2], &pc[2]);
  printf("[3]: 0x%X addr:%u\n", pc[3], &pc[3]);
  num = htonl(num);
  printf("htonl order:\n");
  printf("[0]: 0x%X addr:%u\n", pc[0], &pc[0]);
  printf("[1]: 0x%X addr:%u\n", pc[1], &pc[1]);
  printf("[2]: 0x%X addr:%u\n", pc[2], &pc[2]);
  printf("[3]: 0x%X addr:%u\n", pc[3], &pc[3]);
  return 0;
}

X86平台上的输出:
local order:
[0]: 0x78 addr:4289157020 //低位字节存放在低地址处,则是小端法;
[1]: 0x56 addr:4289157021
[2]: 0x34 addr:4289157022
[3]: 0x12 addr:4289157023 //高位字节存放在高地址处;
htonl order:
[0]: 0x12 addr:4289157020 //由此看出,主机字节序与网络字节不一样;
[1]: 0x34 addr:4289157021
[2]: 0x56 addr:4289157022
[3]: 0x78 addr:4289157023


文章转自: http://blog.csdn.net/songjinshi/article/details/6787762

          



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值