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

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n