什么是字节序?

2023-05-16

字节序

字节序,顾名思义,就是字节组织的顺序。我们可以将其根据其存储时从低位开始还是从高位开始分为两种,具体如下:

类型简写本质
大端BE(big endian)将高序字节存储在起始地址
小端LE(little endian)将低序字节存储在起始地址

这就是大小端序的含义,两者除了顺序上没有其他的区别,在性能上、功能上都是一样的。

注意:

  • 网络协议指定了通讯字节序为大端
  • 只有在多字节数据作为整体处理时才需要考虑字节序
  • 运行在同一台计算机上的进程相互通信时,一般不用考虑字节序
  • 异构计算机之间通讯,需要转换自己的字节序为网络字节序
  • lscpu可以用于查看当前CPU的字节序

从代码角度理解字节序

为了更好的理解,我们实现这样一个功能,定义一个int型变量,它占四个字节,再定义一个char型数组,将int型变量中的内容拷贝进char型数组中,又因为char型变量占一个字节,所以我们定义的这个char型数组中至少有4个变量.

具体代码如下:

#include <iostream>
#include <cstring>
using namespace std;

int main(){
    int n=12345678;
    cout << hex << n << endl;
    char c[4];
    memcpy(c, &n, 4);
    for(auto a:c){
        cout << (short)a << endl;
    }
}

运行结果如下:
在这里插入图片描述
第一行输出即是变量n的十六位进制输出,将其拷贝进char型数组中,输出的第一个变量为4e,而4e在变量n中却是低比特位,故而在我的linux系统中使用的是小端。

两种字节序优缺点

  • 小端优点:符合人的思维的字节序地址低位存储值的低位地址高位存储值的高位。从人的第一观感来说低位值小,就应该放在内存地址小的地方,也即内存地址低位;反之,高位值就应该放在内存地址大的地方,也即内存地址高位。

  • 大端优点:直观的字节序地址,不要考虑对应关系只需要把内存地址从左到右按照由低到高的顺序写出,把值按照通常的高位到低位的顺序写出两者对照,一个字节一个字节的填充进去。

字节序转换函数

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用大端排序方式。

不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序。两大CPU派系中的PowerPC系列采用大端方式存储数据,而x86系列则采用小端方式存储数据。所以在某些时刻需要对字节序进行转换。

网络序转主机序

使用的函数如下:

函数含义作用
ntohs()network to host short把unsigned short类型从网络序转换到主机序
ntohl()network to host long把unsigned long类型从网络序转换到主机序

具体相关代码如下:

#include <iostream>
#include <cstring>
#include <arpa/inet.h>

using namespace std;

int main(){
    int n = 12345678;
    cout << hex << n << endl;
    char c[4];

    int m = htonl(n);
    memcpy(c, &m, 4);
    for(auto a:c){
        cout << (short)a << " ";
    }
    cout << endl;
}

运行结果如下:

在这里插入图片描述
显然原变量的高位存储在了高位上,将我们的小端序转为了大端序。

主机序转网络序

函数含义作用
htons()host to network short把unsigned short类型从主机序转换到网络序
htonl()host to network long把unsigned long类型从主机序转换到网络序

我们以上文的代码为基础,将大端转为小端,具体代码实现如下:

#include <iostream>
#include <cstring>
#include <arpa/inet.h>

using namespace std;

int main(){
    int n = 12345678;
    cout << hex << n << endl;
    char c[4];

    int m = htonl(n);
    memcpy(c, &m, 4);
    for(auto a:c){
        cout << (short)a << " ";
    }
    cout << endl;


    int b = ntohl(m);
    cout << b << endl;
}

运行结果如下:

在这里插入图片描述
显然我们此时又将其转化为小端序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是字节序? 的相关文章

  • OpenCV图像处理学习二十一,直方图比较方法

    一 直方图比较 直方图比较是对输入的两张图像进行计算得到直方图H1与H2 xff0c 归一化到相同的尺度空间 xff0c 然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度 xff08 每张图像都有唯一的直方图与之对应 xff0
  • 嵌入式FreeRTOS学习九,任务链表的构成,TICK时间中断和任务状态切换调度

    一 tskTaskControlBlock 函数结构体 在tskTaskControlBlock 任务控制块结构体中 xff0c 其中有任务状态链表和事件链表两个链表成员 xff0c 首先介绍任务状态链表这个结构 xff0c 这个链表通常用
  • SOAP传输协议

    一 HTTP传输协议 超文本传输协议 xff08 HyperText Transfer Protocol xff0c 缩写 xff1a HTTP xff09 xff0c 它是基于请求 响应的模式协议 xff0c 客户端发出请求 xff0c
  • ONVIF简介

    一 什么是ONVIF ONVIF规范描述了网络视频的模型 接口 数据类型以及数据交互的模式 并复用了一些现有的标准 xff0c 如WS系列标准等 ONVIF规范的目标是实现一个网络视频框架协议 xff0c 使不同厂商所生产的网络视频产品 x
  • gsoap工具生成onvif设备搜索(remotediscovery)代码框架

    什么是gsoap工具 xff1f gSOAP 提供了两个工具来方便开发人员使用 C C 43 43 语言快速开发Web 服务应用 xff0c 通过 gSOAP 提供的这两个工具 xff0c 开发人员可以快速生成服务端与客户端代码框架 xff
  • Latex之给字符上加横线、波浪等

    Latex 前几天想在 x x x 上加波浪号 xff0c 一时间忘记怎么打 xff0c 现在记录下来 xff0c 以后好查阅 加 号 xff1a hat x 加横线 xff1a overline x 加宽 xff1a widehat x
  • 数据结构笔记-2(线性表)

    线性表 2 1 线性表 1 定义 是零个或多个具有相同类型的数据元素的有序数列 xff1b xff08 长度等于零的线性表为空表 xff09 非空线性表通常记为 xff1a L xff1d a 1 xff0c a 2 xff0c xff0c
  • 数据结构-6(图)

    图 图的逻辑结构 图的定义 xff1a 图是由顶点的有穷非空集合和顶点之间边的集合组成 xff0c 通常表示为 xff1a G 61 V xff0c E 其中 xff1a G表示一个图 xff0c V是图G中顶点的集合 xff0c E是图G
  • 【leetcode常见面试题】螺旋矩阵解题思路

    文章目录 螺旋矩阵解题思路先找行进路线找每条路线的结束位置再找每条路线的结束位置模拟行走 螺旋矩阵 II总结 螺旋矩阵 解题思路 本题可以采用模拟的方式 xff0c 设4种行走方向 xff0c 如下图 xff1a 先找行进路线 4个方向的行
  • C++面向对象程序设计学习心得

    C 43 43 面向对象程序设计学习心得 经过几周c 43 43 面向对象程序设计的学习 xff0c 对面向对象程序设计有了一些了解 递归 简单地讲 xff0c 递归就是程序直接或间接调用本身的编程技巧 xff0c 通过把一个不能或不好解决
  • STL学习心得

    STL概述 STL组件 1 容器 xff08 Container xff09 xff0d 管理某类对象的集合 2 迭代器 xff08 Iterator xff09 xff0d 在对象集合上进行遍历 xff08 注意 xff1a 这些集合可能
  • 安装nodejs和vue出现问题

    安装nodejs国内镜像时报错 npm install g cnpm registry 61 https registry npm taobao org不知道这是啥错误 xff0c 怎么改啊 xff1f 安装vue 从官网点击下载 下载后点
  • Jetson nano/nx通过网线连接电脑实现远程控制

    Jetson nano nx通过网线连接电脑实现远程控制 摘要1 nano nx桌面共享设置2 安装dconf editor解除加密3 自启VNC server4 网络共享5 获取IP地址6 安装PuTTy7 安装VNC Viewwer8
  • 一文解决MySQL突击面试,关键知识点总结

    文章目录 MySQL重要知识点回顾一 索引1 为什么需要索引2 索引的结构3 避免索引失效3 1 联合索引不满足最左匹配原则3 2 隐式转换3 3 like查询3 4 索引列存在运算或者使用函数3 5 优化器 4 执行计划4 1 type4
  • 51单片机应用篇-- --数码管60秒计时,独立按键可调

    开篇先说一句废话 本旺名字叫萨摩耶 xff0c xff0c Please 叫我旺财 xff0c xff0c xff0c 哈哈 xff0c 招财进宝嘛 xff01 缘由 本来按照我的学习计划 xff0c 我现在应该是单片机的学习过程 xff0
  • 【ESP32+freeRTOS学习笔记之“ESP32环境下使用freeRTOS的特性分析(3-多核环境下的调度)”】

    目录 1 不同核心上分别调度2 tick中断3 关于抢占4 关于同优级的任务按时间片调度5 空闲任务6 调度程序暂停7 启动和终止8 禁用中断9 总结 Vanilla FreeRTOS调度器是具有时间切片的固定优先级抢占调度器 xff0c
  • C++ STL 总结(持续更新)

    因为机试需要用c 43 43 xff0c 暴风吸入式学习 xff08 套用 xff09 它的模板 xff0c 发现还真的挺好用的 xff0c 总结一下 时间紧急 xff0c 取自各个网上的博客 xff0c 没来得及仔细整理 xff0c 都给
  • STM32F103笔记(二)——GPIO原理

    GPIO的工作原理与两个实验实例 一 STM32F103 GPIO说明1 stm32 GPIO引脚的主要功能2 GPIO相关配置寄存器的简介3 STM32F103 GPIO的8种工作方式4种输入模式4种输出模式 二 点亮LED实例 xff0
  • VINS-Fusion代码阅读(五)

    对应解析13页 xff0c 四 前端视觉处理 主要包括特征点检测和特征点跟踪两部分 xff0c 似乎是基于openCV实现的 openCV2 4官方文档 xff0c xff08 暂时未找到openCV3 4有类似的文档 xff09 这一节在

随机推荐