Linux网络编程——字节序

目录

一、概念

二、分类

三、高低地址与高低字节

高低地址

高低字节

四、例子

五、字节序转换API


一、概念

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。

二、分类

字节序有两者常见序:

1. Big-Endian(大端):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。如:TCP/IP协议字节序。

2.Little-Endian(小端):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。如:X86系列CPU字节序。

网络字节序 = 大端字节序

三、高低地址与高低字节

高低地址

C程序映射中内存的空间布局大致如下:

最高内存地址 0xFFFFFFFF

栈区(从高内存地址,往 低内存地址发展。即栈底在高地址,栈顶在低地址)

堆区(从低内存地址 ,往 高内存地址发展)

全局区(常量和全局变量)

代码区

最低内存地址 0x00000000

高低字节

在十进制中靠左边的是高位,靠右边的是低位,在其他进制也是如此。例如 0x12345678,从高位到低位的字节依次是0x12、0x34、0x56和0x78。

网络字节序 就是 大端字节序:4个字节的32 bit值以下面的次序传输,首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit

主机字节序 就是 小端字节序,现代PC大多采用小端字节序。

四、例子

在内存中双字0x01020304的存储方式:内存地址是4000&4001&4002&4003

LE(小端):04 03 02 01             BE(大端):01 02 03 04

五、字节序转换API

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换:

#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);
//h表示host(主机地址),to表示转换,n表示network,l表示32位长整数(4个字节),s表示16位短整数(2个字节)。
//如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值