网络字节序

5 篇文章 0 订阅

字节序

前言

为什么会出现大端字节序和小端字节序呢?统一使用一种字节序不是更好吗?


介绍

大端字节序 : 高位字节在低地址,低位字节在高地址

小端字节序: 高位字节在高地址,低位字节在低地址

0x1234567的大端字节序和小端字节学的写法如下图所示:


原因

计算机电路在处理低位字节时,效率比较高,因为计算机都是从低位开始的,所以,计算机的内部处理都是小端字节序;

但是在程序员的眼里,还是习惯读写大端字节序,所以除了计算机内部外,其他场合大都使用大端字节序;如网络传输和文件存储中;


判断字节序

以下已 c++ 为例,判断是否为大端字节序

static bool IsBigEndian() 
{
	const unsigned short n = 0x0001;
    
    //取最后一个字节,判断是否为 1, 如果是,则说明低地址在低位,则为小端字节序
    if(*(char *)&n) 
    {
    	return false;
    }
    return true;
}

字节序转换

以下是字节序转换的函数,通过位移运算符的方式转换。

//16 位字节序转换
static uint16 Swap16(uint16 s)
{
    return (s & 0xff) << 8 | (s >> 8) & 0xff;
}

//32 位字节序转换
static uint32 Swap32(uint32 l)
{
    return l >> 24 |
        (l & 0x00ff0000) >> 8 |
        (l & 0x0000ff00) << 8 |
        l << 24;
}

//64 位字节序转换
static uint64 Swap64(uint64 ll)
{
    return ll >> 56|
        (ll & 0x00ff000000000000) >> 40 |
        (ll & 0x0000ff0000000000) >> 24 |
        (ll & 0x000000ff00000000) >> 8  | 
        (ll & 0x00000000ff000000) << 8  | 
        (ll & 0x0000000000ff0000) << 24 |
        (ll & 0x000000000000ff00) << 40 |
        ll << 56;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值