Как вы можете конвертировать HEX в BIN, один символ за раз в EXCEL 2010 - PullRequest
1 голос
/ 16 марта 2012

Я пытаюсь найти способ взять строку значений HEX и преобразовать их в BIN.Мне нужно конвертировать 1 HEX-символ за раз:

Например: HEX = 0CEC BIN = 0000 1100 1110 1100

Мне нужно сделать это в Excel.Любая помощь будет отличной.

Спасибо, Ларри

Ответы [ 5 ]

6 голосов
/ 16 марта 2012

В модуле

Public Function HEX2BIN(strHex As String) As String
    Dim c As Long, i As Long, b As String * 4, j As Long
    For c = 1 To Len(strHex)
        b = "0000"
        j = 0
        i = Val("&H" & Mid$(strHex, c, 1))
        While i > 0
            Mid$(b, 4 - j, 1) = i Mod 2
            i = i \ 2
            j = j + 1
        Wend
        HEX2BIN = HEX2BIN & b & " "
    Next
    HEX2BIN = RTrim$(HEX2BIN)
End Function

Для

=HEX2BIN("0CEC")
   0000 1100 1110 1100
2 голосов
/ 21 марта 2014

Да, я должен был сделать это недавно. Я опаздываю к игре, но время от времени этим будут заниматься другие люди, поэтому я оставлю код там, где его смогут найти все:

Option Explicit

Public Function HexToBinary(strHex As String, Optional PadLeftZeroes As Long = 5, Optional Prefix As String = "oX") As String
Application.Volatile False

' Convert a hexadecimal string into a binary
' As this is for Excel, the binary is returned as string: there's a risk that it will be treated as a number and reformatted

' Code by Nigel Heffernan, June 2013. Http://Excellerando.Blogspot.co.uk  THIS CODE IS IN THE PUBLIC DOMAIN

' Sample Usage:
'
'   =HexToBinary("8E")
'   oX0010001110
'
'   =HexToBinary("7")
'   oX001111
'
'   =HexToBinary("&HD")
'   oX01101


Dim lngHex As Long
Dim lngExp As Long
Dim lngPad As Long
Dim strOut As String
Dim strRev As String


If Left(strHex, 2) = "&H" Then
    lngHex = CLng(strHex)
Else
    lngHex = CLng("&H" & strHex)
End If

lngExp = 1
Do Until lngExp > lngHex
    ' loop, bitwise comparisons with successive powers of 2
    ' Where bitwise comparison is true, append "1", otherwise append 0
    strRev = strRev & CStr(CBool(lngHex And lngExp) * -1)
lngExp = lngExp * 2
Loop


' As we've done this in ascending powers of 2, the results are in reverse order:
If strRev = "" Then
    HexToBinary = "0"
Else
    HexToBinary = VBA.Strings.StrReverse(strRev)
End If

' The result is padded by leading zeroes: this is the expected formatting when displaying binary data
If PadLeftZeroes > 0 Then
    lngPad = PadLeftZeroes * ((Len(HexToBinary) \ PadLeftZeroes) + 1)
    HexToBinary = Right(String(lngPad, "0") & HexToBinary, lngPad)
End If

HexToBinary = Prefix & HexToBinary

End Function
1 голос
/ 16 марта 2012

Вы можете использовать HEX2BIN(number, [places]).

Синтаксис функции HEX2BIN имеет следующие аргументы:

  • Номер Обязательно. Шестнадцатеричное число, которое вы хотите преобразовать. Номер не может содержать более 10 символов. Наиболее значимым битом числа является знаковый бит (40-й бит справа). Остальные 9 битов являются битами величины. Отрицательные числа представляются в двухзначном обозначении.
  • Места Необязательно. Количество символов для использования. Если места не указаны, HEX2BIN использует минимально необходимое количество символов. Places полезен для заполнения возвращаемого значения ведущими 0 (нулями).
0 голосов
/ 08 марта 2019

Для меня это дает это (извините, в VBA, но имеет преимущество в том, что не запрашивает длину вашей строки для преобразования).Будьте осторожны, я поместил комментарий в нижней части, для которого вы можете добавить пробел между каждым разделом по 4 бита.Кому-то не нужно пространство, а кому-то оно понадобится:

Length = Len(string_to_analyse)
For i = 1 To Length
    Value_test_hexa = Left(Right(string_to_analyse, Length - (i - 1)), 1)
'get the asci value of each hexa character (actually can work as a decimal to binary as well)
    Value_test = Asc(Value_test_hexa)

    If Value_test > 47 And Value_test < 58 Then
        Value_test = Value_test - 48
    End If

' Convert A to F letters to numbers from 10 to 15
    If Value_test > 64 And Value_test < 71 Then
        Value_test = Value_test - 55
    End If

'identify the values of the 4 bits for each character (need to round down)
    a = WorksheetFunction.RoundDown(Value_test / 8, 0)
    b = WorksheetFunction.RoundDown((Value_test - a * 8) / 4, 0)
    c = WorksheetFunction.RoundDown((Value_test - a * 8 - b * 4) / 2, 0)
    d = (Value_test - a * 8 - b * 4 - c * 2)

    Value_converted = Value_converted & a & b & c & d ' can eventually add & " " in order to put a space every 4 bits
Next i

Протестировано ОК, чтобы вы могли его использовать.

0 голосов
/ 01 декабря 2018

Я бы использовал простую формулу следующим образом:

= HEX2BIN (MID (S23,1,2)) & HEX2BIN (MID (S23,3,2)) & HEX2BIN (MID (S23,5,2))) & HEX2BIN (MID (S23,7,2) и HEX2BIN (MID (S23,9,2) и HEX2BIN (MID (S23,11,2) и HEX2BIN (MID (S23,13,2))

S23 = BFBEB991, Результат = 10111111101111101011100110010001

Это позволит вам быть настолько длинным, сколько вам нужно. Просто добавьте столько повторений, сколько вам нужно, увеличив начальную позицию на 2 (например, 1, 3, 5, 7, 9,11, 13, 15, ....). Обратите внимание, что пропущенные символы будут игнорироваться.

...