15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту




Как осуществить преобразование между десятичными, шестнадцатиричными и двоичными значениями

Dim lDec As Long, aHex As String, aBin As String
lDec = 121
aHex = Hex$(lDec) ' Десятичное в шестнадцатиричное
lDec = Val("&H" & aHex) ' Шестнадцатиричное в десятичное
' Обратите внимание, что несоставляет труда преобразовать шестнадцатиричное значение в
' двоичное, поэтому, чтобы преобразовать из десятичного в шестнадцатиричное, удобней сперва преобразовать десятичное в двоичное. Наиболее быстрый способ двоичного преобразования, это
' использовать специальную таблицу преобразования.
Dim vBinTable As Variant
vBinTable = Array("0000", "0001", "0010", "0011", _
"0100", "0101", "0110", "0111", _
"1000", "1001", "1010", "1011", _
"1100", "1101", "1110", "1111")
Dim i As Integer, k As Long
For k = 1 To Len(aHex)
' Шестнадцатиричное в двоичное
i = Val("&H" & Mid$(aHex, k, 1))
aBin = aBin & vBinTable(i)
Next
' Так же несложно сделать преобразование из двоичного значения вдесятичное. Однако,
' это не всегда выполнимо, так как шестнадцатиричные и двоичные значения в VB могут
' представлять из себя намного большие размеры чем десятичное значение. Таким образом
' для преобразование из двоичного в шестнадцатиричное опять прибегнем к таблице
' преобразования, только другого типа.
Dim aBinTable As String, aHexTable As String
aBinTable = " 0000 0001 0010 0011 0100 0101 0110 0111" & _
" 1000 1001 1010 1011 1100 1101 1110 1111 "
aHexTable = "0123456789ABCDEF"
If Len(aBin) Mod 4 Then
' Делаем длину чётной 4
aBin = String$(Len(aBin) Mod 4, "0") & aBin
End If
aHex = ""
For k = 1 To Len(aBin) Step 4
i = InStr(aBinTable, " " & Mid$(aBin, k, 4))
aHex = aHex & Mid$(aHexTable, (i - 1) \ 5 + 1, 1)
Next