007集——数据存储的端序(大端序和小端序转换代码)——VB/VBA

2024-02-11 04:04

本文主要是介绍007集——数据存储的端序(大端序和小端序转换代码)——VB/VBA,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VB/VBA存储的端序

1、要想制造高性能的VB/VBA代码,离了指针是很难办到的。

2、因为VB/VBA里,用Long来表示指针,而32位(包括64位兼容的)计算机里4字节整数的处理,是最快的方式!

3、要想用指针来处理数据,那就得明白数据在内存里的结构(最近系列文章正在分享,欢迎关注),更需要明白数据在内存中的存储顺序问题,这就是端序啦!

4、端序1词最早出于《格列佛游记》中小人国吃鸡蛋,他们不知道是从鸡蛋小头吃起,还是从大头吃起,进而引发了争论!后来,随着计算机的发展,也出现了同样的状况!

5、比如字符串"abc",a在b的左边,c在b的右边。如果将其放入字节数组aByte中,则a为aByte(0),b为aByte(1),也即是说左边的存储到低地址,右边存储到高位置。这就是小端序。

6、再比如数字12345,左边的1比右边的2要大,也即是说低位置是高单位,高位置是低单位。这就是大端序。

例如,对于 int 型整数 0x01020304 来说,按照小端序存储,在内存中的顺序(从低到高)如下:

04    03    02    01
按照大端序存储,在内存中的顺序(从低到高)如下:
01    02    03    04
采用哪种字节序?
        大端和小端有其各自的优势。大端存储的第一个字节是高位,对于一些数值判断(比如正负)会很迅速;小端存储的第一个字节是低位,符号位在最后一个字节,从低位开始计算,效率比较高。

        0x为16进制数的前缀,意思就是当你看到0X,那么后面跟的数字就是16进制的数。上面 的例子为什么用16进制表示呢?

        在计算机底层,内存地址通常以十六进制表示。使用十六进制可以更好地理解和识别内存地址、指针和寄存器等底层系统信息。关于这个本博有专门的一篇文章——>CSDN

7、很显然,在现实生活中,我们同时在使用大、小端序,而且都符合习惯。那在计算机里,能否这样呢?

8、答案是否定的,这跟计算机只认整数的原理是一样的,为了简化计算机设计,一种类型的计算机往往只默认一种端序,尤其是在存储领域。

9、我们常用的X86计算机,就是小端序的。这与我们平时大部分人的习惯顺序是一致的,也即“从小到大”和“从左至右”是主流。

10、但是理解大端序也非常有必要,比如汇编机器码中的地址,就需要端序转换。堆栈结构,也需要有类似的理解。

十进制转化为 r 进制,整数部分用除 r 取余法,小数部分用乘r取整法。

以下实例为4个字节长整型long数据从小端序转为大端序的vba代码:

Function LongToBigEndianBytes(ByVal value As Long) As Byte()' 创建一个4字节的数组,用于存储结果的每个字节Dim bytes(3) As Byte' 将value的每个字节分别赋给数组,从大端序到小端序bytes(0) = value And &HFF        ' 最低字节bytes(1) = (value And &HFF00) \ &H100       ' 次低字节bytes(2) = (value And &HFF0000) \ &H100     ' 次高字节bytes(3) = (value And &HFF000000) \ &H1000000 ' 最高字节' 返回大端序字节数组LongToBigEndianBytes = bytes
End Function
Sub TestLongToBigEndianBytes()Dim littleEndianLong As LonglittleEndianLong = 1000 ' 原始数值Dim mys' 将小端序长整型数转换为大端序字节数组Dim bigEndianBytes() As BytebigEndianBytes = LongToBigEndianBytes(littleEndianLong)' 打印结果(这里打印的是字节的十六进制表示)Dim i As IntegerFor i = LBound(bigEndianBytes) To UBound(bigEndianBytes)mys = mys & Right("00" & Hex(bigEndianBytes(i)), 2)Next iMsgBox "十进制数: " & littleEndianLong & "  对应的十六进制大端序是:" & vbCr & Space(15) & mys
End Sub

1000(十进制) = 3E8(十六进制),补齐8字节后为00 00 03 E8 ,小端序转大端序为E8 03 00 00,如下图所示:

这篇关于007集——数据存储的端序(大端序和小端序转换代码)——VB/VBA的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698779

相关文章

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二