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

相关文章

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim