2010-04-19 109 views
1

我的机器是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)。

回答

0

这里是一个子程序可以让你开始:

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 
2

通过使用简单的按位逻辑。

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函数两次快得多。

相关问题