Smart Box

[VB.net] Bytes to Hex String / Hex String to Bytes 본문

Programming/VB.net

[VB.net] Bytes to Hex String / Hex String to Bytes

프매씨 2017. 6. 12. 07:23

컴퓨터 주변 기기에 관한 코딩을 하다보니, Byte 배열로 통신을 하더라구요.

디버깅을 하기 위해서는 눈으로 값을 직접 봐야하니 Hex String으로 바꾸는 경우가 많습니다.


그래서 이번 포스팅에서는 16진법 문자열(Hex String)와 바이트 배열(Byte Array)를 넘어다니는 함수를 알려드리겠습니다.


[Hex String to Byte Array]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    Public Function HexStringToBytes(ByVal HexString As StringAs Byte()
        'Quick and dirty hex String to Byte array.  Accepts:
        '
        '   "HH HH HH"
        '   "HHHHHH"
        '   "H HH H"
        '   "HH,HH,     HH" and so on.
 
        Dim Bytes() As Byte
        Dim HexPos As Long
        Dim HexDigit As Long
        Dim BytePos As Long
        Dim Digits As Long
 
        ReDim Bytes(Len(HexString) \ 2)
        For HexPos = 1 To Len(HexString)
            HexDigit = InStr("0123456789ABCDEF",
                         UCase$(Mid$(HexString, HexPos, 1))) - 1
            If HexDigit >= 0 Then
                If BytePos > UBound(Bytes) Then
                    ReDim Preserve Bytes(UBound(Bytes) + 4)
                End If
                Bytes(BytePos) = Bytes(BytePos) * &H10 + HexDigit
                Digits = Digits + 1
            End If
            If Digits = 2 Or HexDigit < 0 Then
                If Digits > 0 Then BytePos = BytePos + 1
                Digits = 0
            End If
        Next
        If Digits = 0 Then BytePos = BytePos - 1
        If BytePos < 0 Then
            Bytes = {}
        Else
            ReDim Preserve Bytes(BytePos)
        End If
        Return Bytes
    End Function
cs


해당 소스는 주석에서 설명했듯이, 여러 경우를 받아드립니다.

'HH HH' 이렇게 2개를 간격으로 떨어져있거나, 'HHHH' 이렇게 붙어 있어도 제대로 변환합니다.

심지어 사이 간격에 16진수가 아닌 다른 문자열이 있어도 구분합니다.



[Byte Array to Hex String]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    Public Function BytesToHexString(ByRef ByteArray() As Byte) As String
        Dim lb As Long, ub As Long
        Dim l As Long, strRet As String
        Dim lonRetLen As Long, lonPos As Long
        Dim strHex As String
 
        lb = LBound(ByteArray)
        ub = UBound(ByteArray)
        lonRetLen = ((ub - lb) + 1* 2
        strRet = Space$(lonRetLen)
        lonPos = 1
 
        For l = lb To ub
            strHex = Hex$(ByteArray(l))
            If Len(strHex) = 1 Then strHex = "0" & strHex
            If l <> ub Then
                Mid$(strRet, lonPos, 2= strHex
                lonPos = lonPos + 2
            Else
                Mid$(strRet, lonPos, 2= strHex
            End If
        Next l
 
        Return strRet
    End Function
cs


이 부분에서는 설명드릴게 없네요.


잘 사용하시기 바랍니다 :P

Comments