The following code outputs the swapped values basis the High and Low WORD and BYTE of a value. Most of the output matches with the output from the online calculator at https://www.scadacore.com/tools/prog...hex-converter/ but I am UNABLE to output the UINT32 values of the negative n value. The expected values are commented in the subroutine.
Any possible tweak to code?
Any possible tweak to code?
Code:
Public Sub HILOHEX()
Dim n As Long, hw As Integer, lw As Integer, hb1 As Byte, lb1 As Byte, hb2 As Byte, lb2 As Byte
n = "&H12345678" ' +305419896
If (n And &H80000000) = &H80000000 Then
hw = ((n And &H7FFF0000) \ &H10000) Or &H8000
lw = n Mod &H10000
Else
hw = (n And &H7FFF0000) \ &H10000
lw = n Mod &H10000
End If
CopyMemory hb1, ByVal VarPtr(hw) + 1&, 1&
CopyMemory lb1, ByVal VarPtr(hw), 1&
CopyMemory hb2, ByVal VarPtr(lw) + 1&, 1&
CopyMemory lb2, ByVal VarPtr(lw), 1&
Debug.Print (n)
Debug.Print "HiWord = " & (hw)
Debug.Print "HiByte = " & (hb1)
Debug.Print "LoByte = " & (lb1)
Debug.Print "LoWord = " & (lw)
Debug.Print "HiByte = " & (hb2)
Debug.Print "LoByte = " & (lb2)
Debug.Print ""
Debug.Print "SignedINT32 - Big Endian (ABCD):"; ((hw * &H10000) Or (lw And &HFFFF&))
Debug.Print "SignedINT32 - Little Endian (DCBA):"; (SwapByt(lw) * &H10000) Or (SwapByt(hw) And &HFFFF&)
Debug.Print "SignedINT32 - Mid-Big Endian (BADC):"; (SwapByt(hw) * &H10000) Or (SwapByt(lw) And &HFFFF&)
Debug.Print "SignedINT32 - Mid-Big Endian (CDAB):"; (lw * &H10000) Or (hw And &HFFFF&)
Debug.Print ""
Debug.Print "SignedINT16 - Big Endian (AB):" & MakeInt(hb1, lb1)
Debug.Print "SignedINT16 - Big Endian (AB):" & MakeInt(hb2, lb2)
Debug.Print "SignedINT16 - Big Endian (BA):" & MakeInt(lb1, hb1)
Debug.Print "SignedINT16 - Big Endian (BA):" & MakeInt(lb2, hb2)
Debug.Print ""
Debug.Print "UINT32 - Big Endian (ABCD):"; ((hw * &H10000) Or (lw And &HFFFF&))
Debug.Print "UINT32 - Little Endian (DCBA):"; (SwapByt(lw) * &H10000) Or (SwapByt(hw) And &HFFFF&)
Debug.Print "UINT32 - Mid-Big Endian (BADC):"; (SwapByt(hw) * &H10000) Or (SwapByt(lw) And &HFFFF&)
Debug.Print "UINT32 - Mid-Big Endian (CDAB):"; (lw * &H10000) Or (hw And &HFFFF&)
Debug.Print ""
Debug.Print "UINT16 - Big Endian (AB):" & MakeInt(hb1, lb1)
Debug.Print "UINT16 - Big Endian (AB):" & MakeInt(hb2, lb2)
Debug.Print "UINT16 - Big Endian (BA):" & MakeInt(lb1, hb1)
Debug.Print "UINT16 - Big Endian (BA):" & MakeInt(lb2, hb2)
Debug.Print ""
n = "&HEDCBA988" ' -305419896
If (n And &H80000000) = &H80000000 Then
hw = ((n And &H7FFF0000) \ &H10000) Or &H8000
lw = n Mod &H10000
Else
hw = (n And &H7FFF0000) \ &H10000
lw = n Mod &H10000
End If
CopyMemory hb1, ByVal VarPtr(hw) + 1&, 1&
CopyMemory lb1, ByVal VarPtr(hw), 1&
CopyMemory hb2, ByVal VarPtr(lw) + 1&, 1&
CopyMemory lb2, ByVal VarPtr(lw), 1&
Debug.Print (n)
Debug.Print "HiWord = " & (hw)
Debug.Print "HiByte = " & (hb1)
Debug.Print "LoByte = " & (lb1)
Debug.Print "LoWord = " & (lw)
Debug.Print "HiByte = " & (hb2)
Debug.Print "LoByte = " & (lb2)
Debug.Print ""
Debug.Print "SignedINT32 - Big Endian (ABCD):"; ((hw * &H10000) Or (lw And &HFFFF&))
Debug.Print "SignedINT32 - Little Endian (DCBA):"; (SwapByt(lw) * &H10000) Or (SwapByt(hw) And &HFFFF&)
Debug.Print "SignedINT32 - Mid-Big Endian (BADC):"; (SwapByt(hw) * &H10000) Or (SwapByt(lw) And &HFFFF&)
Debug.Print "SignedINT32 - Mid-Big Endian (CDAB):"; (lw * &H10000) Or (hw And &HFFFF&)
Debug.Print ""
Debug.Print "SignedINT16 - Big Endian (AB):" & MakeInt(hb1, lb1)
Debug.Print "SignedINT16 - Big Endian (AB):" & MakeInt(hb2, lb2)
Debug.Print "SignedINT16 - Big Endian (BA):" & MakeInt(lb1, hb1)
Debug.Print "SignedINT16 - Big Endian (BA):" & MakeInt(lb2, hb2)
Debug.Print ""
Debug.Print "UINT32 - Big Endian (ABCD):"; ' 3989547400
Debug.Print "UINT32 - Little Endian (DCBA):"; ' 2292829165
Debug.Print "UINT32 - Mid-Big Endian (BADC):"; ' 3421341865
Debug.Print "UINT32 - Mid-Big Endian (CDAB):"; ' 2844323275
Debug.Print ""
Debug.Print "UINT16 - Big Endian (AB):"; ' 60875
Debug.Print "UINT16 - Big Endian (AB):"; ' 43400
Debug.Print "UINT16 - Big Endian (BA):"; ' 52205
Debug.Print "UINT16 - Big Endian (BA):"; ' 34985
Debug.Print ""
End Sub
Public Function MakeInt(ByVal m As Byte, ByVal n As Byte) As Integer
If m And &H80 Then
MakeInt = ((m * &H100&) Or n) Or &HFFFF0000
Else
MakeInt = (m * &H100) Or n
End If
End Function
Public Function SwapByt(ByRef n As Integer) As Integer
Dim b2 As Byte, b1 As Byte
If n And &H8000 Then
b1 = ((n And &H7F00) / &H100) Or &H80
Else
b1 = (n And &HFF00) / &H100
End If
b2 = n And &HFF
If b2 And &H80 Then
SwapByt = (b2 And &H7F) * &H100 Or b1 Or &H8000
Else
SwapByt = b2 * &H100 Or b1
End If
End Function