Converting big-endian into little-endian and vice-versa in VBA

后端 未结 3 1100
借酒劲吻你
借酒劲吻你 2021-01-07 01:34

My machine is little-endian (Intel byte order). I need to read a binary file containing 16-bit signed integer data in Motorola/IEEE byte order (\"big-endian\"), then do some

相关标签:
3条回答
  • 2021-01-07 02:23

    Here is a subroutine that may get you started:

    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
    
    0 讨论(0)
  • 2021-01-07 02:32

    By using simple bitwise logic.

    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
    

    Well, not so simple due to VBA limitations. Still, I believe that will be much faster than calling CopyMemory function twice.

    0 讨论(0)
  • 2021-01-07 02:38

    Here is a simple ASCII conversion:

    Public Function SwapLong(Data As Long) As Long
    
        Const Sz As Integer = 3
        Dim Bytes(Sz) As Byte
        Dim n As Integer
        Dim HexStr As String
        Dim SwpStr As String
    
        HexStr = Right("00000000" + Hex(Data), 2 * (Sz + 1))
        SwpStr = vbNullString
    
        For n = 0 To Sz
            SwpStr = SwpStr + Mid(HexStr, (Sz - n) * 2 + 1, 2)
        Next n
    
        SwapLong = CLng("&h" + SwpStr)
    
    End Function
    
    Public Function SwapInt(Data As Integer) As Integer
    
        Const Sz As Integer = 1
        Dim Bytes(Sz) As Byte
        Dim n As Integer
        Dim HexStr As String
        Dim SwpStr As String
    
        HexStr = Right("0000" + Hex(Data), 2 * (Sz + 1))
        SwpStr = vbNullString
    
        For n = 0 To Sz
            SwpStr = SwpStr + Mid(HexStr, (Sz - n) * 2 + 1, 2)
        Next n
    
        SwapInt = CInt("&h" + SwpStr)
    
    End Function
    
    0 讨论(0)
提交回复
热议问题