大小端字节序/网络字节序

字节序-cpu对内存中的数据以字节为单位的存取顺序
主机字节序的大小端取决于cpu架构
小端字节序:低地址存低位(x86-小端)
大端字节序:低地址存高位(MIPS/ARM-大端)

int a=1
0x00 00 00 01
数据高位-----数据低位
01 00 00 00 -小端(01走斜线)
00 00 00 00 -大端(01走直线)
内存低地址-----内存高地址

为什么有大小端?
cpu对数据在内存中以字节为单位进行存取
一个内存块大小为1个字节-8bit,char类型8bit,int类型32bit;
那么必然存在着如何将多个字节安排的问题,因此就导致了大小端字节序的存储模式

如何判断大小端?
1.强制类型转换
&a-取地址a
(char*)&a-强制类型转换为char*
*(char*)&a-解引用
return *(char*)&a等价于char*p=(char*)&a; return*p;
2.联合体-联合体的成员共用一块内存空间,他们在内存的起始地址是一样的。
#include<iostream>
using namespace std;
int check1(){
    int a = 1;
    return *(char*)&a;
}
int check2(){
    union un
    {
        char c;
        int i;
    }un;
    un.i = 1;
    return un.c;
}
int main(){
    int ret = check2();
    if (1 == ret){
        cout << "小端" << endl;
    }
    else{
        cout << "大端" << endl;
    }
    return 0;
}

主机字节序对网络通信的影响:
不同主机字节序进行通信容易造成数据二义, 将自己的数据字节序转换成标准字节序再进行传输, 如果当前发送主机是小端,就需要先将数据转成大端;否则就忽略,直接发送即可

网络字节序-网络通信中数据字节序标准-大端字节序
网络通信中哪些数据需要进行网络字节序的转换?
存储单元大于一个字节的数据类型
uint8_t/char-以单字节为存储单元的数据不需要转换
#
字节序只针对某个独立的基础数据类型(自定义类型的成员变量/数组的单个元素)
不涉及自定义类型(结构体struct s-只针对s中的成员变量)和数组(只针对数组中的单个元素)
#
字符串的传输不受字节序影响-字符串本身就是单字节存储以及传输的
#
发送主机将发送缓冲区中的数据按内存地址从低到高的顺序发出
网络数据流的地址规定:先发出的数据是低地址,后发出的数据是高地址
接收主机把从网络上接收的数据按内存地址从低到高的顺序依次保存在接收缓冲区中

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值