深入理解计算机系统 -- 大端与小端字节序

2023-05-16

一、大端字节序 vs. 小端字节序

字节序指一个多字节对象在内存中存储的方式,小端字节序机器在存储多字节对象时采用低地址存低有效字节的策略,大端则恰恰相反。字节序由CPU架构决定,与操作系统无直接关系。像常见的x86架构、arm架构CPU,都采用的是小端字节序,而power pc采用的是大端字节序。

举个栗子:

变量x的类型为int,位于地址0x100处,它的十六进制值为0x01234567.那么内存中的映像如下表所示:

地址0x1000x1010x1020x103
大端法-值01234567
小端法-值67452301

二、如何判断机器的字节序

现在很多CPU架构已经同时支持大端字节序与小端字节序,就我自己实际情况而言,很少遇到大端机器。或许你在面试的过程中有被问到用编程的方式判断当前机器字节序的问题,内核代码中就有很好的示范:

static union { char c[4]; unsigned long mylong; } endian_test = { {'l', '?', '?', 'b'} };
#define ENDIANNESS ( (char)endian_test.mylong )

宏ENDIANNESS输出l就是小端机器,输出b就是大端机器。

三、socket编程中的大小端

学过socket编程的都知道,在发送数据前需要使用hton这样的函数进行主机字节序到网络字节序的转换。那么是不是所有的数据都需要这样的转换呢?显然不是。

因为在网络中传输的数据就是单纯的字节流,假设现在有A主机给B主机通过网络发送数据,B不能知道A是大端机器还是小端机器,自然也不能知道接受到的数据是大端字节序还是小端字节序。因此,必须约定发送到网络中的数据的字节序(大端字节序)。A在发送数据前调用hton做字节序转换,如果A本身是大端机器(主机序是大端序),那么hton就是一个空操作。如果A是小端机器(主机序是小端序),那么hton就完成了小端序到大端序的转换(主机序到网络序的转换)。这样,B从网络拿到数据就按照约定的大端序(网络序)做处理。

这过程有一个有趣的事实是,数据(或字节流)从A发送到B,在内存中的存储顺序并不会发生任何改变。B在收到数据后,如果是单字节的对象(如char类型,字符串也是一样),不存在字节序的问题。如果是多字节的对象(如int类型),那么就调用ntoh做网络序到主机序的转换。如果B是大端机器(主机序本身是大端序),那么ntoh就是一个空操作,反之,ntoh就完成大端序到小端序的转换(网络序到主机序的转换)。

四、总结

如果是本地存储,对于一个多字节对象,大端与小端机器在内存中的映像是完全相反的。

如果是通过网络发送,发方在发送前,要将多字节对象做主机序到网络序的转换。收方收到的数据(或字节流)在内存中的映像与发方是完全一致的,只是在处理多字节对象时,需要做网络序到主机序的转换。

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

深入理解计算机系统 -- 大端与小端字节序 的相关文章

  • jsoncpp与rapidjson易用性与性能评测

    文章目录 jsoncpp与rapidjson易用性与性能评测1 概述2 易用性2 1 jsoncpp2 2 rapidjson 3 性能4 总结 jsoncpp与rapidjson易用性与性能评测 1 概述 jsoncpp和rapidjso
  • 二叉树的构建、遍历及c++实现

    文章目录 二叉树遍历二叉树构建c 43 43 实现原码 二叉树遍历 二叉树有四种遍历方式 xff0c 先序遍历 中序遍历 后序遍历和层次遍历 xff0c 其中层次遍历类似于图结构里面的广度优先搜索BFS xff0c 先序遍历类似于深度优先搜
  • NodeJS开发web应用程序之http,express,socket.io介绍

    文章目录 NodeJS开发web应用程序之http xff0c express xff0c socket io介绍1 http2 express3 socket io NodeJS开发web应用程序之http xff0c express x
  • [编译问题解决]error: ‘atomic_int32_t’ in namespace ‘std’ does not name a type

    编译问题解决 error atomic int32 t in namespace std does not name a type https en cppreference com w cpp atomic atomic c 43 43
  • ffmpge转码常用指令介绍(不断更新...)

    帧率 分辨率 码率 文件大小转换 ffmpeg i input mp4 r 30 b a 100k b v 200k s 1920x1080 fs 4000K output mp4 i 输入视频文件 r 输出帧率 b a 输出音频码率 b
  • 解决linux系统下java调用带breakpad异常捕获的c++ sdk必现crash问题

    问题背景 java通过jni去集成c 43 43 sdk时线上发现会有偶现崩溃 xff0c 为了方便定位native c 43 43 的崩溃 xff0c sdk采用了google breakpad崩溃转储方案 xff08 Google跨平台
  • 基于netlink的Linux Network Monitor实现

    一 背景 来源于产品开发需求 xff0c 需要在linux系统下实现网络状类型查询及网络类型变更通知 xff0c 比如从Ethernet变为Wifi xff0c 从Wifi变为Ethernet等 二 设计方案 Linux系统提供了Netli
  • Altium Designer绘制一个stm32最小系统的电路原理图

    文章目录 一 Altium Designer二 新建工程文件三 绘制原理图库1 绘制元器件2 导入元器件库3 绘制模块 一 Altium Designer Altium Designer 是原Protel软件开发商Altium公司推出的一体
  • C++11面向切面编程(AOP)入门指南

    何为AOP 面向切面编程 xff08 AOP xff0c Aspect Oriented Programming xff09 是一种编程范式 xff0c 允许开发者在不修改原有代码的情况下 xff0c 为程序添加额外的功能 什么是面向切面编
  • 车道线识别/Opencv/传统方法

    车道检测 Advanced Lane Finding Project 实现步骤 使用提供的一组棋盘格图片计算相机校正矩阵 camera calibration matrix 和失真系数 distortion coefficients 校正图
  • 2019新买电脑必备软件

    都2019了 xff0c 怎么还要安装这些垃圾软件 xff01 群丫头买了个新电脑 xff0c 为了避免她踩到笔者曾今踩到的坑 xff0c 更舒心的使用电脑 xff0c 为此特写此文 作为一个电脑平凡使用者 xff0c 用过无数的软件 xf
  • Docker与anaconda+jupyter

    Arch docker的安装 pacman 安装docker sudo pacman S docker docker启动 sudo systemctl start docker 设置开机启动docker sudo systemctl ena
  • Opencv目标追踪

    参考 xff1a https www pyimagesearch com 2018 07 30 opencv object tracking 引言 Opencv作为图像处理开源库包含了Object Tracking目标追踪的一些API xf
  • 使用cmake编译,组织C++项目

    文章目录 前言例一例二例三 前言 这篇博客是我对cmake用法的一些经验总结 还很浅显 如果有错误或者更好的方案 欢迎指正 使用方法统一为在build目录中执行 cmake make 我觉得养成外部编译是一个好习惯 例一 目录结构为 lzj
  • Spring Security Oauth2.0认证授权

    基本概念 认证 用户认证就是判断一个用户的身份是否合法的过程 xff0c 用户去访问系统资源时系统要求验证用户的身份信息 xff0c 身份合法方可继续访问 xff0c 不合法则拒绝访问 常见的用户身份认证方式有 用户名密码登录 xff0c
  • C语言实现HTTP的GET和POST请求

    HTTP请求和IP TCP 所谓的HTTP协议是基于IP TCP协议的 xff0c 所以要获取远端的html数据只要创建socket对象就足够了 xff1b HTTP是基于IP TCP加上了网络请求的固定格式 get 请求 include
  • 英伟达GPU安装教程

    英伟达GPU安装教程
  • 四种插头类型:XH、VH、SM、HY

    PH1 25mm HY2 0mm XH2 5 2 54mm xff08 这两个其实是一样的 xff09 VH3 96mm 插头分成三种类型 xff1a XH xff1b VH xff1b SM xff1b HY XH 4Y 是插头 xff1
  • STM32F1C8T6Flash读取音频和DAC播放

    文章目录 一 Flash简介1 Flash原理2 STM32F1中的Flash 二 Flash地址空间的数据读取1 题目要求2 CUbeMX工程建立3 Keil工程修改4 STlink调试说明5 调试运行 三 基于片内Flash的提示音播放
  • C语言中的头文件为什么不能定义变量

    1 前提 在实际项目中 xff0c 会遇到这样的情况 xff0c 在链接阶段 xff0c 会提示定义在头文件中的变量 xff0c 重定义 xff0c 然后将将头文件中的变量定义成static类型 xff0c 然后 xff0c 不报错误了 例

随机推荐

  • Ubuntu16.04安裝ROS

    此文章在前人的基礎上 xff0c 並把安裝遇到的問題寫出來 Ubuntu16 04安装ROS Kinetic详细过程 https blog csdn net weixin 43159148 article details 83375218
  • B-spline的理解与路径规划中的应用及C++代码的实现

    研究项目 xff0c 无人机的路径规划 xff0c 需要用到B样条 xff0c 所以在此写下B spline的结合C 43 43 代码的理解以及在项目中的应用 一 阶数p 阶数 61 所有权重中t的最高次幂 61 控制点数量 1 xff1b
  • Jetson TX2 各个模式

    Jetson TX2 工作模式及相应的CPU和GPU频率 xff1a 上电的时候 xff0c 默认最低功耗模式1 xff0c 风扇不转 1 直接运行home下的jetson clocks sh xff0c 开启最大频率 sudo jetso
  • 网络通信基础知识—网络通信的发展历程

    网络通信基础知识 网络通信的发展历程 xff08 1 xff09 单机阶段 xff08 2 xff09 局域网阶段 xff08 3 xff09 广域网internet阶段 xff08 很多个局域网之间通信 xff09 xff08 4 xff
  • win7下装ubuntu双系统 硬盘安装详细教程

    本文转载自http www linuxidc com Linux 2014 10 108430 htm https jingyan baidu com article e4d08ffdace06e0fd2f60d39 html 在自己安装过
  • ROS导航——配置机器人的导航功能(move_base包)

    中间部分是整个导航的核心部分 xff0c 由move base功能包提供 配置如下 xff1a lt launch gt lt node pkg 61 34 move base 34 type 61 34 move base 34 resp
  • 基于docker安装tensorflow

    最近在自学机器学习 xff0c 大热的Tensorflow自然不能错过 xff0c 所以首先解决安装问题 xff0c 为了不影响本地环境 xff0c 所以本文基于Docker来安装Tensorflow xff0c 我的环境是Ubuntu16
  • okHttpUtil工具类

    pom文件 lt dependency gt lt groupId gt com squareup okhttp3 lt groupId gt lt artifactId gt okhttp lt artifactId gt lt vers
  • 基于采样的RRT/RRT*/RRT_connect算法笔记及C++实现

    本文记录常见的基于采样的RRT算法及相关改进算法 xff08 RRT xff0c RRT connect xff09 的原理和代码实现效果 与上一章介绍A 算法的文章不同 xff0c 本文会先给出几种算法之间的效果对比 xff0c 先有个直
  • STM32F103ZE驱动PMW3901光流模块

    本文将会简单的介绍如何使用STM32F103ZE驱动PMW3901光流模块 xff0c 使用标准库 所用材料如下 一块 STM32F103最小系统板以及一个 PMW3901光流模块 通过查阅PMW3901的数据手册可以得知 xff0c 该芯
  • 计算两圆相交面积

    转自 xff1a 模板 求两圆相交面积 xff08 模板 xff09 两圆相交分如下集中情况 xff1a 相离 相切 相交 包含 设两圆圆心分别是O1和O2 xff0c 半径分别是r1和r2 xff0c 设d为两圆心距离 又因为两圆有大有小
  • 深蓝学院-移动机器人运动规划重点笔记

    移动机器人运动规划笔记 xff0c 转载自https blog csdn net wqwqqwqw1231 article details 107310965 感谢原作者的总结 xff01
  • TFmini Plus在Arduino上的开发例程(二)

    本例程以Arduino Uno板为例 xff0c 通过Arduino实现TFmini Plus相关指令的写入 xff0c 上行数据的读取 判断和测量数据的获取打印 xff0c 主要帮助客户快速熟悉我公司雷达 xff0c 减少产品的研发周期
  • Linux命令发送Http GET/POST请求

    Linux命令发送Http GET POST请求 Get请求 1 使用curl命令 xff1a curl span class token string 34 http www baidu com 34 span 如果这里的URL指向的是一
  • VSCode 常用设置项

    代码编辑工具VSCode 常用设置项 span class token punctuation span span class token comment VScode主题配置 span span class token string 34
  • 机器人运动控制-上位机通讯

    机器人 xff0c 无论是工业机器人还是服务机器人等多种类机器人 xff0c 都有自己的控制器 在他们的控制面板上 xff0c 我们可以通过简单的操作和程序指令 xff0c 让机器人自行运动 为了让机器人更加智能 xff0c 我们需要在机器
  • Imu误差模型、零偏、零偏稳定性

    原文链接 零偏 xff0c 零偏稳定性和零偏重复性 xff0c IMU误差模型 什么是零偏 xff08 Bias xff09 在陀螺静止时 xff0c 陀螺仪仍会 xff0c 以规定时间内测得的输出量平均值相应的等效输入角速率表示 xff0
  • 海思3516a实现OSD叠加水印

    文章目录 前言一 三个文件的编译二 海思SDK使用步骤1 创建叠加字符2 添加叠加区域到视频通道 总结 前言 两天的努力终于实现了 xff0c 激动 xff01 在网上查阅了各种资料 xff0c 只是有零散的信息 xff0c 海思3516a
  • 结合下图,说明UART的工作原理

    结合下图 xff0c 说明UART的工作原理 UART提供三个独立的异步串行I O口 xff0c 他们可以运行于中断模式或者DMA模式 xff0c 也就是说UART可以产生中断请求或者DMA请求 xff0c 以便在CPU和UART之间传输数
  • 深入理解计算机系统 -- 大端与小端字节序

    一 大端字节序 vs 小端字节序 字节序指一个多字节对象在内存中存储的方式 xff0c 小端字节序机器在存储多字节对象时采用低地址存低有效字节的策略 xff0c 大端则恰恰相反 字节序由CPU架构决定 xff0c 与操作系统无直接关系 像常