大小端转换

news2025/1/31 17:55:45

一、名词解释

首先解释一下大端模式和小端模式。

小端模式,也叫小端存储:

Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

大端模式,也叫大端存储:

Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

比如说数字1045037161

大端存储:

DEC:1045037161

低地址-------------------------->高地址

HEX: 0x3E 0x4A 0x00 0x69

BIN:00111110 01001010 00000000 01101001

小端存储:

DEC:1761626686

低地址-------------------------->高地址

HEX: 0x69 0x00 0x4A 0x3E

BIN:01101001 00000000 01001010 00111110

再举个例子,比如数字37

大端存储:

DEC:37

低地址-------------------------->高地址

HEX: 0x00 0x00 0x00 0x25

BIN:00000000 00000000 00000000 00100101

小端存储:

DEC:620756992

低地址-------------------------->高地址

HEX: 0x25 0x00 0x00 0x00

BIN:00100101 00000000 00000000 00000000

一个字节就是8bit,大小端就是一个字节正着存,一个字节反着存。这两种没有那种好还是不好,就是存储模式不同。但是人们熟悉的方式肯定是大端存储,37读出来就是37,如果是小端存储读出来就是620756992,完全不知道是什么了。

计算机存储是按照字节存储的,一个字节是8比特。但是如果数据比较大,一个字节存储不下,就需要多个字节存储。比如0x1122,也就是数字4386,就是占用了两个字节进行存储。那么0x11就是高位字节,0x22就是低位字节。而存储字节变多了之后,存储的可能性也就会变多了。为了保证数据存储和使用不出错,我们必须按照某种规范进行存储数据。比如0x1122,可以按照0x11 0x22的顺序进行存储(即大端存储),也可以按照0x22 0x11的循序进行存储(即小端模式)。这里就解释了上面的大小端定义。在一个独立的系统中,只要选择一个稳定的存储模式就可以保证系统内部不出错。但是如果和外部系统进行数据交换,则需要商定交换协议,如果两个系统存储方式不同,就涉及到大小端转换问题了。

C语言是小端存储,java都是大端存储。所以java要想读C语言生成的二进制文件,就需要大小端转换了。

二、大小端转换方式

大小端转换其实很简单,就是byte数组,把位置倒叙一下就可以了。自己写代码也就是一个循环,如下:

    /**
     * 切换大小端
     */
    public static byte[] changeBytesEndian(byte[] x){
        byte[] y = new byte[x.length];
        for (int i = 0; i < y.length; i++) {
            y[i] = x[y.length - i - 1];
        }
        return y;
    }

不过,比较正统的转换方式是使用ByteBuffer的order方法。

    /**
     * 将bytes转为大端数据,返回int
     * c存储二进制文件是用的小端存储,java都是大端存储,因此需要转换,此方法用于将数据转为大端存储,读出二进制文件
     * @param bytes
     * @return
     */
    private static int bytesToBigEndian(byte[] bytes) {
        return ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getInt();
    }

    /**
     * 将bytes转为小端数据,返回int
     * c存储二进制文件是用的小端存储,java都是大端存储,因此需要转换,此方法用于将数据转为小端存储,写入二进制文件
     * @param bytes
     * @return
     */
    private static int bytesToLittleEndianInt(byte[] bytes){
        return ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN).getInt();
    }

当然,其他数据类型也是支持的。只是输入的bytes要自己按照位数写对,short是2位,int是4位,long是8位......基础知识就不多说了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/140343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022年度技术总结

2022 年度总结 本年收获 计算机网络 2022年2月&#xff0c;系统学习巩固了计算机网络课程&#xff08;本科&#xff09;&#xff0c;基本的七层模式&#xff0c;四层模式&#xff0c;重点是与前端开发相关的 TCP UDP HTTP HTTPS 等协议。 现在有一个整体的认识&#xff1a;…

@Transactional事务处理解决方案的看法

Transactional事务处理解决方案的看法前言一.声明式事务二.编程式事务三.事务粒度优化方法四.缓存和事务的一致性五.介绍--延时双删总结前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 本文就是了解一下声明式事务和编程式事务的优缺点和事务一致性的一…

怎样阅读NLP论文

经典的论文也是需要读的。并不是所有的论文都值得细读。论文不是从头赶着朝下读。 目录收集和组织论文收集组织1.通过会议的方式分类2.是否是arXiv上的文章分类&#xff08;preprint or not&#xff09;3.根据问题&#xff08;推荐&#xff09;&#xff0c;方法和数据集分类选择…

Ka波段卫星通信小尺寸无线电设计

传统Ka波段地面站卫星通信系统依赖于室内到室外配置。室外单元包含天线和块下变频接收机&#xff0c;接收机输出L波段的模拟信号。该信号随后被传送到室内单元&#xff0c;室内单元包含滤波、数字化和处理系统。Ka波段的干扰信号通常较少&#xff0c;因此室外单元的主要任务是以…

微信小程序开发整体过程整理

目录1微信开发相关介绍1.1微信公众平台1.2微信开放平台1.3注意事项2微信小程序开发整体介绍2.1微信小程序简介2.2小程序接入流程3框架简介3.1uni-app简介3.2学习使用uni-app3.3学习微信小程序开发4开发规范5开发示例5.1开发工具5.2开发调试5.2.1导入代码5.2.2项目运行5.2.3在微…

第三篇 - 对象的单层劫持

一&#xff0c;前言 上篇&#xff0c;介绍了 Vue 使用及数据初始化的流程 回顾一下&#xff0c;主要涉及以下几个核心点&#xff1a; initMixin 方法&#xff1a; 原型方法 Vue.prototype._initvm.$options&#xff1a;使 options 选项在 vm 实例上被共享initState 方法&…

c#入门-匿名函数,多播委托

匿名函数 如果一个函数的参数是一个委托类型。而你此刻没有合适的方法组使用&#xff0c;也不想为他专门声明一个局部函数。 则可以使用匿名函数。匿名函数的创建更为简单&#xff0c;语法为&#xff1a;返回类型 参数列表 > 函数主体 Func<int, string> func str…

人工智能OCR文字识别研究

1 研究背景 人工智能是研究开发能够模拟、延伸和扩展人类智能的理论、方法、技术及应用系统的一门新的技术科学&#xff0c;研究目的是促使智能机器会听&#xff08;语音识别、机器翻译等&#xff09;、会看&#xff08;图像识别、文字识别等&#xff09;、会说&#xff08;语音…

使用Jiralert实现AlertManager告警对接Jira

简介 Alertmanager 处理由客户端应用程序&#xff08;如 Prometheus server&#xff09;发送的警报。它负责去重(deduplicating)&#xff0c;分组(grouping)&#xff0c;并将它们路由(routing)到正确的接收器(receiver)集成&#xff0c;如电子邮件&#xff0c;微信&#xff0c…

MMYOLO 自定义数据集从标注到部署保姆级教程

theme: juejin 来自社区 PeterH0323 投稿 AI 已经被应用到各行各业&#xff0c;现如今任何人都可以轻松基于开源框架快速搭建符合自身需求的 AI 应用。本文将基于 MMYOLO 开源框架&#xff0c;基于生活中收集的猫猫数据集&#xff0c;教你如何从零开始训练一个可部署检测模型…

TiCDC 源码阅读(二)TiKV CDC 模块介绍

内容概要 TiCDC 是一款 TiDB 增量数据同步工具&#xff0c;通过拉取上游 TiKV 的数据变更日志&#xff0c;TiCDC 可以将数据解析为有序的行级变更数据输出到下游。 本文是 TiCDC 源码解读的第二篇&#xff0c;将于大家介绍 TiCDC 的重要组成部分&#xff0c;TiKV 中的 CDC 模…

【C++】命名空间(namespace) 以及理解using namespace std

命名空间1.命名空间使用的背景1.背景2.命名空间的定义&#xff08;namespace&#xff09;2.1正常的定义2.2 命名空间可以嵌套定义2.3允许命名空间相同3.域作用限定符&#xff08;&#xff1a;&#xff1a;&#xff09;和命名空间的使用3.1域作用限定符&#xff08;&#xff1a;…

【nodejs】模块化

一、概念 1、模块化 编程领域中的模块化&#xff0c;就是遵守固定的规则&#xff0c;把一个大文件拆成独立并相互依赖的多个小模块 把代码进行模块化拆分的好处&#xff1a; 1、提高代码的复用性 2、提高代码的可维护性 3、可以实现按需加载 2、模块化规范 对代码进行模块化…

《CSS新世界》读书笔记

前言 本文为《CSS新世界》的读书笔记。推荐去读原著。 《CSS新世界》微信读书APP链接&#xff1a;CSS新世界-张鑫旭-微信读书 (qq.com) 1. 尺寸属性值&#xff1a;fit-content 描述 fit-content 不是一个属性&#xff0c;它是 css 尺寸系列属性的一个新属性值。可用在 wid…

lammps教程:旋转模型的技巧

大家好&#xff0c;我是小马老师。 本文介绍lammps翻转模型的方法。 在进行分子动力学模拟时&#xff0c;可能需要特定的面位于设定的方向。 如Al2O3的力学性能模拟中&#xff0c;需要分别对A、B、C面进行压痕或者摩擦模拟。 按照研究界面垂直z轴&#xff0c;并且面法线沿着z轴…

转转测试环境治理的高效能实践

文章目录1. 背景及需求1.1 系统架构的发展1.2 测试环境的需求2. 传统的测试环境解决方案-物理隔离3. 转转测试环境V1-改进的物理隔离3.1 稳定环境3.2 动态环境3.3 优缺点3.3.1 优点3.3.2 缺点4. 转转测试环境V2-基于自动IP标签的流量路由5. 转转测试环境V3-基于手动标签的流量路…

大数据挖掘-伤寒论和金匮要略(COVID-19用药启示录,1.4万字收藏)

来自Toby老师&#xff0c;大数据挖掘-伤寒论和金匮要略 大家好&#xff0c;我是Toby老师&#xff0c;三年来新冠病毒肆虐全球&#xff0c;带来一些列症状&#xff0c;例如发热&#xff0c;恶寒&#xff0c;咳嗽&#xff0c;咽喉痛&#xff0c;腹泻&#xff0c;心脑血管疾病等…

C语言_动态内存管理

目录 1. 为什么存在动态内存管理 2. 动态内存函数介绍 2.1 开辟内存块函数_malloc 2.2 动态内存释放和回收函数_free 2.3 开辟空间初始化元素为0的函数_calloc 2.4 调整动态内存开辟大小的函数_realloc 3. 常见的动态内存错误 3.1 对NULL进行解引用操作 3.2 对动态开辟…

aloam学习笔记(二)

学习aloam框架中前端对于点云部分的预处理和点面特征提取。 这些功能在scanRegistration.cpp部分实现&#xff0c;所以也是对于这个源码的学习。 一、main函数 从main函数开始分析。 首先整个完整的main函数内容&#xff1a; int main(int argc, char **argv) {ros::init(…

RSA、MD5加密解密算法全套解析安装教程

第一部分介绍加密解密算法&#xff0c; 第二部分介绍我小组成功应用的RSA、MD5两种加密解密算法&#xff0c;以及心得体会。 1、加密解密算法介绍 应用的开发中安全很重要&#xff0c;所以信息加密技术显得尤为重要。我们需要对应用中的多项数据进行加密处理&#xff0c;从而来…