首页 > 其他分享 >小端模式和大端模式——踩坑记录

小端模式和大端模式——踩坑记录

时间:2023-10-27 12:33:30浏览次数:32  
标签:小端 字节 buffer 模式 地址 内存 大端 append

大端小端

1 前言

在做项目时,需要将报文发送给硬件端,报文打包我都是用的大端写入Bytebuf(使用的netty),老大审查代码时,说我写错了,说硬件那边要求是小端传输。不过改成小端写入也容易,重要的是牢记这个知识点。于是趁这个机会复习一下大端和小端。

2 概念

大端(Big-Endian)和小端(Little-Endian)的定义如下:

小端(Little-Endian)数据的低位字节位存放在内存的低地址端,高位字节存放在内存的高地址端。

大端(Big-Endian) 数据的高位字节位存放在内存的低地址端,低位字节存放在内存的高地址端。

2.1 什么是低地址、低地址

地址编号小的是低地址,地址编号大的是高地址

image-20231027003002141

2.2 什么是低位字节、高位字节

那16进制的数字0x12345678来说,它有4个字节(一个字节八位,而两个16进制的数字占位,一个字节能表示的最大数字位0xFF)

 低地址   <===============   高地址
高位字节  <===============  低位字节 
 0x12   |  0x34  |  0x56  |  0x78

在大端模式下的内存存储布局为

 低地址   <===============   高地址
高位字节  <===============  低位字节 
 0x12   |  0x34  |  0x56  |  0x78

在小端模式下的内存存储布局为

 低地址   <===============   高地址
高位字节  <===============  低位字节 
 0x78   |  0x56  |  0x34  |  0x12

3. 举例

3.1 代码

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;

import static io.netty.buffer.ByteBufUtil.appendPrettyHexDump;
import static io.netty.util.internal.StringUtil.NEWLINE;


public class TestEndian {
    
    public static void main(String[] args) {
        ByteBuf buffer = Unpooled.buffer();
        // 大端写入
        buffer.writeInt(0x12345678);
        log(buffer);

        ByteBuf buffer2 = Unpooled.buffer();
        // 小端写入
        buffer2.writeIntLE(0x12345678);  
        log(buffer2);
    }
    
    /**
     * 显示数据在ByteBuf中的存储接口1
     * @param buffer ByteBuf
     */
    private static void log(ByteBuf buffer){
        int length=buffer.readableBytes();
        int rows=length/16+(length%15==0?0:1)+4;
        StringBuilder buf=new StringBuilder(rows*80*2)
                .append("read index:").append(buffer.readerIndex())
                .append(" write index:").append(buffer.writerIndex())
                .append(" capacity:").append(buffer.capacity())
                .append(NEWLINE);
        appendPrettyHexDump(buf,buffer);
        System.out.println(buf.toString());
    }
}

3.2 控制台结果

read index:0 write index:4 capacity:256
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 12 34 56 78                                     |.4Vx            |
+--------+-------------------------------------------------+----------------+
read index:0 write index:4 capacity:256
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 78 56 34 12                                     |xV4.            |
+--------+-------------------------------------------------+----------------+

控制台中,0,1,2,3,4,...,f,代表从低地址到高地址,第二行可以看到:

  • 大端写入时,高位字节位存放在内存的低地址端低位字节存放在内存的高地址端
  • 小端写入时,低位字节位存放在内存的低地址端高位字节存放在内存的高地址端

标签:小端,字节,buffer,模式,地址,内存,大端,append
From: https://www.cnblogs.com/HuaJFrame/p/17792088.html

相关文章

  • uniapp的easycom模式
    uniapp的easycom模式,无需import和注册components,即可在页面使用固定目录下的组件。这个目的是简化引用,其实还挺坑的。1.直接使用组件,全局又搜索不到引用,第一感觉让人摸不着头脑2.不引用组件,文件下放了多个组件,不知道到底使用了哪个3.进行组件优化,要删除或提取某些组件的时......
  • 【编程开发指南】「设计模式系列」一起来学编程界的“兵法”设计模式(序章)
    设计模式是什么设计模式是一种被广泛应用于软件开发中的技术,它可以帮助开发人员更好地组织和管理代码,提高代码的可读性和可维护性。本文将介绍设计模式的概念、分类和应用场景。设计模式的概念设计模式是一种被反复使用的代码设计经验,它可以解决特定问题的通用解决方案。设计模式不......
  • 软件设计之抽象工厂模式
    类图代码packagetest;importjava.util.Scanner;publicclasstest3{publicstaticvoidmain(String[]args){Factorysfactory=null;ProductAproductA=null;ProductBproductB=null;System.out.println("请输入你想要的......
  • 设计模式—创建型模式之单例模式
    设计模式—创建型模式之单例模式介绍单例模式说明:一个单一的类,负责创建自己的对象,同时确保系统中只有单个对象被创建。单例模式特点:某个类只能有一个实例;(构造器私有)它必须自行创建这个实例;(自己编写实例化逻辑)它必须自行向整个系统提供这个实例;(对外提供实例化方法)单例模式......
  • 数据的存储--->【大小端字节序】(Big Endian)&(Little Endian)
    博主主页:@威化小餅干......
  • pageofficeV6强制留痕模式编辑
    转载:强制留痕模式编辑强制留痕模式编辑注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。Word中的“痕迹”功能可以跟踪文档中所做的更改。痕迹可以包括添加、删除、移动和格式更改等。Word提供了“痕迹保留”功......
  • Nacos单机模式配置远程数据源、配置身份认证
    1.nacos介绍官网链接:https://nacos.io/zh-cn/docs/what-is-nacos.htmlGithub:https://github.com/alibaba/nacos/Nacos/nɑ:kəʊs/是DynamicNamingandConfigurationService的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos致力于......
  • 结构型模式(三) 外观模式
    外观模式:是为了给子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得子系统更加容易使用。减少系统之间的耦合性,提高了灵活性和安全性角色:外观类、子系统类classCpu:defstart(self):print('cpustart')defstop(self):......
  • 视频主动上报模式
    视频主动上报模式是一种监控系统中的重要技术,它主要涉及摄像机的数据传输和上报。这种模式通常包括以下步骤:摄像机安装与连接:首先,需要将摄像机安装在需要监控的位置,并确保摄像机能够正常工作。同时,需要将摄像机通过网线或无线网络连接到网络中,以便能够将拍摄到的视频数据传输到......
  • python读取和写入txt等文件,文件打开模式,文件对象常用函数
     ......