小端序为很多系统默认的数据存储方式,但有些数据格式为大端序模式解读文件,因此我们需将小端序字节颠倒排序,这样用大端序模式解读此文件,最后即可读取我们想要的内容。方法如下:
Function SwapEndian(ByVal value As Long) As Long
' 将 Long 类型的值拆分为 4 个 Byte
Dim byte1 As Long, byte2 As Long, byte3 As Long, byte4 As Long
byte1 = value Mod 256 ' 最低有效字节
value = value \ 256 ' 移除最低有效字节
byte2 = value Mod 256 ' 次低有效字节
value = value \ 256
byte3 = value Mod 256 ' 次高有效字节
value = value \ 256
byte4 = value ' 最高有效字节
' 交换字节顺序以从大端序排列
Dim temp As Long
temp = byte1
byte1 = byte4
byte4 = temp
temp = byte2
byte2 = byte3
byte3 = temp
SwapEndian = byte4 * &H100000 + byte3 * &H1000 + byte2 * &H10 + byte1
' 将交换后的字节重新组合为 Long 类型的值
End Function
Sub endiancovert()
Dim mylong As Long
' 假设 mylong 是你要转换的 Long 类型值
mylong = 1000
'MsgBox mylong & " 转为十六进制为: " & Hex(mylong)
mylong = SwapEndian(mylong)
'MsgBox "端序转换后为: " & Hex(mylong)
MsgBox "转换端序后对应的数为:" & mylong
End Sub
&H :
&H
是一个前缀,用于表示接下来的字符是十六进制(Hexadecimal)数值。VBA 支持多种数字表示法,包括十进制(默认)、八进制(使用 &O
前缀)和十六进制(使用 &H
前缀)。
十六进制是一种基数为 16 的数制系统,它使用 0-9 的十个阿拉伯数字和 A-F(或小写 a-f)的六个英文字母来表示数值。其中,A-F 代表十进制的 10-15。
例如,在 VBA 中,你可以使用十进制表示法来声明一个整数变量:
vba复制代码
Dim decimalValue As Integer | |
decimalValue = 255 |
或者,你可以使用十六进制表示法来声明并初始化同一个整数变量:
vba复制代码
Dim hexValue As Integer | |
hexValue = &HFF |
在这两个例子中,decimalValue
和 hexValue
都将包含相同的数值,即十进制的 255,十六进制的 FF。
使用十六进制表示法在某些情况下非常有用,特别是当你处理二进制数据、内存地址、颜色代码(如 RGB 值)或其他需要直接操作位模式的场景时。
在这里说下hex函数
Hex 函数
返回代表十六进制数值的 String。
语法
Hex(number)
必要的 number 参数为任何有效的数值表达式或字符串表达式。
说明
如果 number 还不是一个整数,那么在执行前会先被四舍五入成最接近的整数。
如果 number 为 | 所得为 |
---|---|
Null | Null |
Empty | 零 (0) |
任何其他的数字 | 最多可到八个十六进制字符。 |
适当范围内的数字,前缀以 &H
,可以直接表示十六进制数字。例如,十六进制表示法的 &H10
代表十进制的 16。
十六进制数转为10进制可用如下函数:Val(&H10)
Val 函数
返回包含于字符串内的数字,字符串中是一个适当类型的数值。
十六进制与二进制转换代码:
Function HexToBinary(ByVal hexString As String) As String
' 将16进制字符串转换为十进制数
Dim decimalValue As Long
decimalValue = Val("&H" & hexString)
' 将十进制数转换为二进制字符串
HexToBinary = DecToBin(decimalValue)
End Function
' 辅助函数:将十进制数转换为二进制字符串
Function DecToBin(ByVal decimalValue As Long) As String
Dim binaryString As String
Dim remainder As Long
' 循环直到十进制数为0
Do While decimalValue > 0
' 取余数作为当前位
remainder = decimalValue Mod 2
binaryString = CStr(remainder) & binaryString
' 整除2
decimalValue = decimalValue \ 2
Loop
' 如果二进制字符串为空,则返回"0"
If binaryString = "" Then
binaryString = "0"
End If
' 返回二进制字符串
DecToBin = binaryString
End Function
Sub TestHexToBinary()
Dim hexNumber As String
Dim binaryNumber As String
hexNumber = "a" ' 十六进制数
binaryNumber = HexToBinary(hexNumber) ' 转换为二进制数
' 显示结果
MsgBox "Binary value: " & binaryNumber
End Sub