当前位置: 首页 > news >正文

字节序大小端

概述

    • 1. 大小端是什么
    • 2. 如何判断本机大小端
    • 3.大小端转换

1. 大小端是什么

在计算机科学中,大小端(Endian)是一个术语,用于描述多字节数据在内存中的存储顺序。具体地说,它指的是一个数据单元(如整数、浮点数等)的字节如何在内存地址中排列。这个术语来源于“Endian”一词,它源自于乔纳森·斯威夫特的小说《格列佛游记》中的一个小岛,岛上的居民在争论吃鸡蛋时应该从大头(Big-End)开始还是从小头(Little-End)开始,这反映了一种在细节上争执不下的文化。

大端(Big-Endian)
在大端字节序中,数据的最高有效字节(MSB,Most Significant Byte)存储在内存的低地址端,而最低有效字节(LSB,Least Significant Byte)存储在内存的高地址端。这种顺序与人类阅读的顺序相似,即从左到右,从高位到低位。

小端(Little-Endian)
在小端字节序中,数据的最低有效字节(LSB)存储在内存的低地址端,而最高有效字节(MSB)存储在内存的高地址端。这与大端字节序完全相反。

2. 如何判断本机大小端

#include <iostream>  // 函数用于判断本机的大小端模式  
bool isLittleEndian() {  // 定义一个联合体,包含一个整型和一个字符数组  union {  uint32_t i;  char c[4];  } test;  // 给整型赋值,这里使用了一个十六进制数,方便查看其在内存中的存储方式  test.i = 0x01020304;  // 检查字符数组的第一个字节  // 如果是小端模式,低地址处存储的是低位字节,即0x04  // 如果是大端模式,低地址处存储的是高位字节,即0x01  return test.c[0] == 4; // 注意这里直接比较的是字符的ASCII值,'4'的ASCII值是52,但这里我们实际上是在比较整数值4  
}  int main() {  if (isLittleEndian()) {  std::cout << "This machine is little endian." << std::endl;  } else {  std::cout << "This machine is big endian." << std::endl;  }  return 0;  
}

3.大小端转换

#include <iostream>// 大小端类型
enum EndianType{eEndianLittle,eEndianBig
};// 函数用于判断本机的大小端模式  
bool isLittleEndian() {  union {  uint32_t i;  char c[4];  } test;  test.i = 0x01020304;  return test.c[0] == 4;
}// 返回本机大小端
const EndianType& LocalEndianType()
{static EndianType type = isLittleEndian() ? eEndianLittle : eEndianBig;return type;
}// 转换大小端
using Byte = unsigned char;
void toEndian(const EndianType& type, Byte* begin, int size)
{if (size > 1 && LocalEndianType()!=type){Byte* beg = begin, *end = begin + size - 1;while(beg < end){std::swap(*beg++,*end--);}}
}int main()
{union {  uint32_t i;  unsigned char sz[4];  } test;  test.i = 0x01020304;std::cout << (int)test.sz[0] << std::endl;toEndian(eEndianBig, test.sz, 4);std::cout << (int)test.sz[0] << std::endl;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 无人机之导航系统篇
  • 单片机如何使用超声波传感器进行距离测量
  • 电子合同怎么制作?9款常用电子合同软件
  • Python爬虫新手指南及简单实战
  • 【大模型从入门到精通5】openAI API高级内容审核-1
  • 防水分线盒DB系列单通道预铸线缆智能仓储系统
  • Cadence学习笔记 Day0 Cadence17.4环境安装
  • 线程相关个人笔记总结
  • 【人工智能专栏】Xavier initialization合理的初始化权值
  • python XML2SRS
  • JVM虚拟机底层原理和机制
  • 新手教学系列——使用 Redis 实现任务队列:先进先出和后进先出的选择
  • html实现好看的塔罗牌、十二星座运势网站源码
  • IDEA如何去掉编辑框右侧的竖线
  • 【代码管理系列】2. 项目开发过程中我们的技术债是如何生成的,技术债你知多少
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【React系列】如何构建React应用程序
  • 2017 前端面试准备 - 收藏集 - 掘金
  • 2017-08-04 前端日报
  • avalon2.2的VM生成过程
  • C++类的相互关联
  • Computed property XXX was assigned to but it has no setter
  • httpie使用详解
  • JavaScript新鲜事·第5期
  • Redux系列x:源码分析
  • Spring Cloud Feign的两种使用姿势
  • TypeScript迭代器
  • 浮现式设计
  • 工程优化暨babel升级小记
  • 回顾2016
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 提醒我喝水chrome插件开发指南
  • 微信小程序:实现悬浮返回和分享按钮
  • 详解移动APP与web APP的区别
  • 携程小程序初体验
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • mysql面试题分组并合并列
  • # 安徽锐锋科技IDMS系统简介
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #微信小程序(布局、渲染层基础知识)
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (70min)字节暑假实习二面(已挂)
  • (C++17) optional的使用
  • (Git) gitignore基础使用
  • (二)hibernate配置管理
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (接口封装)
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .Net 6.0--通用帮助类--FileHelper
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core 和 .NET Framework 中的 MEF2