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

相关文章

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

使用Dify访问mysql数据库详细代码示例

《使用Dify访问mysql数据库详细代码示例》:本文主要介绍使用Dify访问mysql数据库的相关资料,并详细讲解了如何在本地搭建数据库访问服务,使用ngrok暴露到公网,并创建知识库、数据库访... 1、在本地搭建数据库访问的服务,并使用ngrok暴露到公网。#sql_tools.pyfrom

Java springBoot初步使用websocket的代码示例

《JavaspringBoot初步使用websocket的代码示例》:本文主要介绍JavaspringBoot初步使用websocket的相关资料,WebSocket是一种实现实时双向通信的协... 目录一、什么是websocket二、依赖坐标地址1.springBoot父级依赖2.springBoot依赖

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

什么是 Java 的 CyclicBarrier(代码示例)

《什么是Java的CyclicBarrier(代码示例)》CyclicBarrier是多线程协同的利器,适合需要多次同步的场景,本文通过代码示例讲解什么是Java的CyclicBarrier,感... 你的回答(口语化,面试场景)面试官:什么是 Java 的 CyclicBarrier?你:好的,我来举个例