在VBA中将big-endian转换成little-endian,反之亦然
问题描述:
我的机器是little-endian(英特尔字节顺序)。我需要以Motorola/IEEE字节顺序(“big-endian”)读取包含16位有符号整数数据的二进制文件,然后进行一些计算,最后将结果integer
数据写入大端二进制文件中。在VBA中将big-endian转换成little-endian,反之亦然
如何在VBA中完成上述操作,即将big-endian转换为little-endian,反之亦然?
原因是,我正在处理NASA Shuttle Radar Topography Mission数据(HGT file format)。
答
这里是一个子程序可以让你开始:
Public Sub ProcessData()
Dim inputFileName As String
Dim outputFileName As String
Dim wordCount As Integer
Dim i As Integer
Dim msb As Byte
Dim lsb As Byte
Dim unsignedWord As Long
Dim word As Integer
inputFileName = "C:\Input.bin"
outputFileName = "C:\Output.bin"
wordCount = FileLen(inputFileName)/2
Open inputFileName For Binary Access Read As #1
Open outputFileName For Binary Access Write As #2
For i = 1 To wordCount
Get #1, , msb
Get #1, , lsb
unsignedWord = CLng(msb) * 256 + lsb
If unsignedWord > 32768 Then
word = -CInt(65536 - unsignedWord)
Else
word = CInt(unsignedWord)
End If
' Do something with each word.
word = -word
If word < 0 Then
unsignedWord = 65536 + word
Else
unsignedWord = word
End If
msb = CByte(unsignedWord/256)
lsb = CByte(unsignedWord Mod 256)
Put #2, , msb
Put #2, , lsb
Next
Close #1
Close #2
End Sub
答
通过使用简单的按位逻辑。
Public Function SwapBytes(ByVal i As Integer) As Integer
Dim b1 As Byte, b2 As Byte
b1 = i And &HFF
If i And &H8000 Then
b2 = ((i And &H7F00)/256) Or &H80
Else
b2 = (i And &HFF00)/256
End If
If b1 And &H80 Then
SwapBytes = (b1 And &H7F) * 256 Or b2 Or &H8000
Else
SwapBytes = b1 * 256 Or b2
End If
End Function
好吧,由于VBA的限制,并非如此简单。 不过,我相信这会比调用CopyMemory函数两次快得多。