Quantcast
Viewing all articles
Browse latest Browse all 15015

High and Low WORD and BYTE of a value --- Code Issue

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?

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


Viewing all articles
Browse latest Browse all 15015

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>