Перетворити шістнадцятковий у бінарний


Відповіді:


106

Для вирішення задачі лівої сторони нульового рівня:


my_hexdata = "1a"

scale = 16 ## equals to hexadecimal

num_of_bits = 8

bin(int(my_hexdata, scale))[2:].zfill(num_of_bits)

Це дасть 00011010 замість обробленої версії.


4
Розрахунок для кількості біт є len(my_hexdata) * log2(scale).
Едд

4
Не дає провідних нулів, якщо шістнадцятковий рядок починається з 00.
Дракон

@Dragon myhex = '1A' bin (int (myhex, 16)) [2:]. Zfill (8) >>> '00011010' zhex = '00' bin (int (zhex, 16)) [2:]. zfill (8) >>> '00000000' Здається, що це працює, навіть коли шістнадцятковий рядок дорівнює '00'.
DeanM

58
import binascii

binary_string = binascii.unhexlify(hex_string)

Прочитайте

binascii.unhexlify

Повертає двійкові дані, представлені шістнадцятковим рядком, вказаним як параметр.


17
Це повертає "бінарний" як у фактичних байтах, але він не перетворює його у представлення для друку як "0" та "1".
Метт Гуд

docs.python.org/library/binascii.html має підзаголовок Перетворити між бінарними та ASCII. Чи це не означає, що він повертає рядок?
pavium

Так, він повертає рядок, що містить представлені байти, наприклад >>> unhexlify ("ab") "\ xab"
Matt Good

9
Будь-яка ідея, як повернути "001010100"?
Девід 天宇 Вонг

1
Я не знаю, чому це було проголосовано, оскільки воно не відповідає фактичному запиту ОП - дивіться будь-який з інших повідомлень для відповіді
Девід Гласс

45
bin(int("abc123efff", 16))[2:]

7
Якщо вхід "1a", це дає "11010", а не "00011010", що може бути або не бути тим, що ви хочете.
Метт Гуд

4
Цілком розумно потрібні провідні нулі (і не потрібні їм). Ви можете, наприклад, нульовим байтом 0x00 бути восьми нульових біт - це важливо для деяких програм. Також у ОП є головний нуль у його прикладі (але я підозрюю, що це випадково в цьому випадку!)
Скотт Гріффітс

42

Перетворити шістнадцятковий у бінарний

У мене є ABC123EFFF.

Я хочу мати 001010101111000001001000111110111111111111 (тобто двійковий довідник, скажімо, з 42 цифр і ведучими нулями).

Коротка відповідь:

Нові f-рядки в Python 3.6 дозволяють зробити це, використовуючи дуже короткий синтаксис:

>>> f'{0xABC123EFFF:0>42b}'
'001010101111000001001000111110111111111111'

або розбити це семантикою:

>>> number, pad, rjust, size, kind = 0xABC123EFFF, '0', '>', 42, 'b'
>>> f'{number:{pad}{rjust}{size}{kind}}'
'001010101111000001001000111110111111111111'

Довга відповідь:

Те, що ви насправді говорите, - це те, що ви маєте значення в шістнадцятковому зображенні, і ви хочете представляти еквівалентне значення у двійковому.

Значення еквівалентності - ціле число. Але ви можете почати з рядка, а для перегляду у двійковій формі потрібно закінчити рядком.

Перетворити шістнадцятковий у двійковий, 42 цифри та провідні нулі?

У нас є кілька прямих способів досягнення цієї мети, без злому за допомогою скибочок.

По-перше, перш ніж ми взагалі зможемо виконати будь-яку двійкову маніпуляцію, перетворимось на int (я припускаю, що це у рядковому форматі, а не як буквальний):

>>> integer = int('ABC123EFFF', 16)
>>> integer
737679765503

Альтернативно, ми могли б використовувати ціле число, що виражається у шістнадцятковій формі:

>>> integer = 0xABC123EFFF
>>> integer
737679765503

Тепер нам потрібно виразити ціле число у двійковому поданні.

Використовуйте вбудовану функцію, format

Потім перейдіть до format:

>>> format(integer, '0>42b')
'001010101111000001001000111110111111111111'

Для цього використовується міні-мова специфікації форматування .

Щоб розбити це, ось його граматична форма:

[[fill]align][sign][#][0][width][,][.precision][type]

Щоб перетворити це на специфікацію для наших потреб, ми просто виключаємо речі, які нам не потрібні:

>>> spec = '{fill}{align}{width}{type}'.format(fill='0', align='>', width=42, type='b')
>>> spec
'0>42b'

і просто передайте це у формат

>>> bin_representation = format(integer, spec)
>>> bin_representation
'001010101111000001001000111110111111111111'
>>> print(bin_representation)
001010101111000001001000111110111111111111

Форматування рядків (шаблонування) за допомогою str.format

Ми можемо використовувати це в рядку str.formatметодом:

>>> 'here is the binary form: {0:{spec}}'.format(integer, spec=spec)
'here is the binary form: 001010101111000001001000111110111111111111'

Або просто помістіть специфікацію прямо в початковий рядок:

>>> 'here is the binary form: {0:0>42b}'.format(integer)
'here is the binary form: 001010101111000001001000111110111111111111'

Форматування рядків за допомогою нових f-рядків

Продемонструємо нові f-рядки. Вони використовують ті самі правила форматування міні-мови:

>>> integer = 0xABC123EFFF
>>> length = 42
>>> f'{integer:0>{length}b}'
'001010101111000001001000111110111111111111'

Тепер давайте поставимо цю функцію у функцію заохочення повторного використання:

def bin_format(integer, length):
    return f'{integer:0>{length}b}'

А зараз:

>>> bin_format(0xABC123EFFF, 42)
'001010101111000001001000111110111111111111'    

Убік

Якщо ви насправді просто хотіли кодувати дані у вигляді рядка байтів у пам'яті або на диску, ви можете скористатися int.to_bytesметодом, який доступний лише в Python 3:

>>> help(int.to_bytes)
to_bytes(...)
    int.to_bytes(length, byteorder, *, signed=False) -> bytes
...

А оскільки 42 біт, розділений на 8 біт на байт, дорівнює 6 байтам:

>>> integer.to_bytes(6, 'big')
b'\x00\xab\xc1#\xef\xff'

31
>>> bin( 0xABC123EFFF )

'0b1010101111000001001000111110111111111111'


2
Не дає провідних нулів, якщо шістнадцятковий рядок починається з 00.
Дракон

14
"{0:020b}".format(int('ABC123EFFF', 16))

3
Не дає провідних нулів, якщо шістнадцятковий рядок починається з 00.
Дракон

10

Ось досить необґрунтований спосіб зробити це за допомогою бітового фідінгу для створення бінарних рядків.

Ключовий біт, який потрібно зрозуміти:

(n & (1 << i)) and 1

Що генерує або 0, або 1, якщо встановлений i-й біт n.


import binascii

def byte_to_binary(n):
    return ''.join(str((n & (1 << i)) and 1) for i in reversed(range(8)))

def hex_to_binary(h):
    return ''.join(byte_to_binary(ord(b)) for b in binascii.unhexlify(h))

print hex_to_binary('abc123efff')

>>> 1010101111000001001000111110111111111111

Редагувати: використовуючи "новий" потрійний оператор, це:

(n & (1 << i)) and 1

Стають:

1 if n & (1 << i) or 0

(Який TBH я не впевнений, наскільки це читабельно)


1
Я знаю, що це по-старому, але який саме сенс "і 1"?
Ласощі

Це за старі часи пітона перед термінальним оператором. (N & (1 << i)) поверне нуль або щось інше, ніж нуль. Ми хочемо лише один або нуль, щоб "і 1" були там, щоб забезпечити це.
Джон Монтгомері

Цей сценарій найкраще працював для мене для перетворення приватного криптовалютного ключа в шістнадцятковий формат у бінарний для тестування. Хтось знає, як розділити двійковий рядок на 8 бітових фрагментів і роздрукувати його? тобто 01111001 11111110.
Едісон

5

Це незначний дотик до рішення Глена Мейнара, що, на мою думку, це правильний спосіб зробити це. Він просто додає елемент підкладки.


    def hextobin(self, hexval):
        '''
        Takes a string representation of hex data with
        arbitrary length and converts to string representation
        of binary.  Includes padding 0s
        '''
        thelen = len(hexval)*4
        binval = bin(int(hexval, 16))[2:]
        while ((len(binval)) < thelen):
            binval = '0' + binval
        return binval

Витягнув це з класу. Просто вийміть, self, якщо ви працюєте в автономному сценарії.


5

Використовуйте функцію вбудованого формату () та функцію int () Це легко зрозуміти. Це трохи спрощена версія відповіді Аарона

int ()

int(string, base)

формат ()

format(integer, # of bits)

Приклад

# w/o 0b prefix
>> format(int("ABC123EFFF", 16), "040b")
1010101111000001001000111110111111111111

# with 0b prefix
>> format(int("ABC123EFFF", 16), "#042b")
0b1010101111000001001000111110111111111111

# w/o 0b prefix + 64bit
>> format(int("ABC123EFFF", 16), "064b")
0000000000000000000000001010101111000001001000111110111111111111

Дивіться також цю відповідь


3

Замініть кожну шістнадцяткову цифру відповідними 4 двійковими цифрами:

1 - 0001
2 - 0010
...
a - 1010
b - 1011
...
f - 1111

2
Або замініть кожну пару шістнадцяткових цифр на відповідні 8 двійкових цифр, або замініть кожну трійку шістнадцяткових цифр відповідними 12 двійковими цифрами ... або замініть кожну 10 шістнадцяткових цифр на відповідні 40 двійкових цифр - На жаль! назад, звідки ми почали!
pavium

2

шістнадцятковий -> десятковий, а потім десятковий -> двійковий

#decimal to binary 
def d2b(n):
    bStr = ''
    if n < 0: raise ValueError, "must be a positive integer"
    if n == 0: return '0'
    while n > 0:
        bStr = str(n % 2) + bStr
        n = n >> 1    
    return bStr

#hex to binary
def h2b(hex):
    return d2b(int(hex,16))

1

Інший спосіб:

import math

def hextobinary(hex_string):
    s = int(hex_string, 16) 
    num_digits = int(math.ceil(math.log(s) / math.log(2)))
    digit_lst = ['0'] * num_digits
    idx = num_digits
    while s > 0:
        idx -= 1
        if s % 2 == 1: digit_lst[idx] = '1'
        s = s / 2
    return ''.join(digit_lst)

print hextobinary('abc123efff')

Це не вдається, якщо для hex_string встановлено значення 'f0'
mikemaccana

1

Я додав обчислення кількості бітів, які потрібно заповнити, до рішення Онедінкенеді. Ось отримана функція:

def hextobin(h):
  return bin(int(h, 16))[2:].zfill(len(h) * 4)

Де 16 - це база, з якої ви конвертуєтесь (шістнадцятковий), а 4 - скільки біт потрібно представити для кожної цифри, або журналу бази 2 шкали.


0
 def conversion():
    e=raw_input("enter hexadecimal no.:")
    e1=("a","b","c","d","e","f")
    e2=(10,11,12,13,14,15)
    e3=1
    e4=len(e)
    e5=()
    while e3<=e4:
        e5=e5+(e[e3-1],)
        e3=e3+1
    print e5
    e6=1
    e8=()
    while e6<=e4:
        e7=e5[e6-1]
        if e7=="A":
            e7=10
        if e7=="B":
            e7=11
        if e7=="C":
            e7=12
        if e7=="D":
            e7=13
        if e7=="E":
            e7=14
        if e7=="F":
            e7=15
        else:
            e7=int(e7)
        e8=e8+(e7,)
        e6=e6+1
    print e8

    e9=1
    e10=len(e8)
    e11=()
    while e9<=e10:
        e12=e8[e9-1]
        a1=e12
        a2=()
        a3=1 
        while a3<=1:
            a4=a1%2
            a2=a2+(a4,)
            a1=a1/2
            if a1<2:
                if a1==1:
                    a2=a2+(1,)
                if a1==0:
                    a2=a2+(0,)
                a3=a3+1
        a5=len(a2)
        a6=1
        a7=""
        a56=a5
        while a6<=a5:
            a7=a7+str(a2[a56-1])
            a6=a6+1
            a56=a56-1
        if a5<=3:
            if a5==1:
                a8="000"
                a7=a8+a7
            if a5==2:
                a8="00"
                a7=a8+a7
            if a5==3:
                a8="0"
                a7=a8+a7
        else:
            a7=a7
        print a7,
        e9=e9+1

0

у мене є коротка надія, яка допомагає :-)

input = 'ABC123EFFF'
for index, value in enumerate(input):
    print(value)
    print(bin(int(value,16)+16)[3:])

string = ''.join([bin(int(x,16)+16)[3:] for y,x in enumerate(input)])
print(string)

спочатку я використовую ваш вхід і перераховую його, щоб отримати кожен символ. то я перетворюю його у бінарне та обробляйте з 3-го положення до кінця. Хитрість отримати 0 - це додати максимальне значення вхідних даних -> у цьому випадку завжди 16 :-)

коротка форма ist метод приєднання. Насолоджуйтесь.


0
# Python Program - Convert Hexadecimal to Binary
hexdec = input("Enter Hexadecimal string: ")
print(hexdec," in Binary = ", end="")    # end is by default "\n" which prints a new line
for _hex in hexdec:
    dec = int(_hex, 16)    # 16 means base-16 wich is hexadecimal
    print(bin(dec)[2:].rjust(4,"0"), end="")    # the [2:] skips 0b, and the 

0

Бінарна версія ABC123EFFF насправді 101010111100000100100011111011111111111111

Практично для всіх додатків ви хочете, щоб двійкова версія мала довжину, кратну 4, з провідним набиванням 0.

Щоб отримати це в Python:

def hex_to_binary( hex_code ):
  bin_code = bin( hex_code )[2:]
  padding = (4-len(bin_code)%4)%4
  return '0'*padding + bin_code

Приклад 1:

>>> hex_to_binary( 0xABC123EFFF )
'1010101111000001001000111110111111111111'

Приклад 2:

>>> hex_to_binary( 0x7123 )
'0111000100100011'

Зауважте, що це працює і в Micropython :)


0

Просто використовуйте модуль coden (зверніть увагу: я є автором модуля)

Ви можете перетворити там шістнадцятковий у двійковий.

  1. Встановити за допомогою pip
pip install coden
  1. Перетворити
a_hexadecimal_number = "f1ff"
binary_output = coden.hex_to_bin(a_hexadecimal_number)

Ключові слова, що перетворюють:

  • шістнадцятковий для шістнадцяткової
  • кошик для двійкових
  • int для десяткової
  • _to_ - ключове слово, що перетворює функцію

Отже, ви також можете форматувати: e. hexadecimal_output = bin_to_hex (a_binary_number)


0

HEX_TO_BINARY_CONVERSION_TABLE = {'0': '0000',

                              '1': '0001',

                              '2': '0010',

                              '3': '0011',

                              '4': '0100',

                              '5': '0101',

                              '6': '0110',

                              '7': '0111',

                              '8': '1000',

                              '9': '1001',

                              'a': '1010',

                              'b': '1011',

                              'c': '1100',

                              'd': '1101',

                              'e': '1110',

                              'f': '1111'}

def hex_to_binary(hex_string):
    binary_string = ""
    for character in hex_string:
        binary_string += HEX_TO_BINARY_CONVERSION_TABLE[character]
    return binary_string

-1
a = raw_input('hex number\n')
length = len(a)
ab = bin(int(a, 16))[2:]
while len(ab)<(length * 4):
    ab = '0' + ab
print ab

7
Де опис / пояснення?
Суфіан

-1
import binascii
hexa_input = input('Enter hex String to convert to Binary: ')
pad_bits=len(hexa_input)*4
Integer_output=int(hexa_input,16)
Binary_output= bin(Integer_output)[2:]. zfill(pad_bits)
print(Binary_output)
"""zfill(x) i.e. x no of 0 s to be padded left - Integers will overwrite 0 s
starting from right side but remaining 0 s will display till quantity x
[y:] where y is no of output chars which need to destroy starting from left"""

-7
no=raw_input("Enter your number in hexa decimal :")
def convert(a):
    if a=="0":
        c="0000"
    elif a=="1":
        c="0001"
    elif a=="2":
        c="0010"
    elif a=="3":
        c="0011"
    elif a=="4":
        c="0100"
    elif a=="5":
        c="0101"
    elif a=="6":
        c="0110"
    elif a=="7":
        c="0111"
    elif a=="8":
        c="1000"
    elif a=="9":
        c="1001"
    elif a=="A":
        c="1010"
    elif a=="B":
        c="1011"
    elif a=="C":
        c="1100"
    elif a=="D":
        c="1101"
    elif a=="E":
        c="1110"
    elif a=="F":
        c="1111"
    else:
        c="invalid"
    return c

a=len(no)
b=0
l=""
while b<a:
    l=l+convert(no[b])
    b+=1
print l
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.