python十六进制转换成二进制_python - 将十六进制转换为二进制

python - 将十六进制转换为二进制

我有ABC123EFFF。

我想拥有001010101111000001001000111110111111111111(即二进制代表,例如42位数和前导零)。

怎么样?

18个解决方案

92 votes

为了解决左侧尾随零问题:

my_hexdata = "1a"

scale = 16 ## equals to hexadecimal

num_of_bits = 8

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

它将给出00011010而不是修剪版本。

Onedinkenedi answered 2019-09-14T20:22:09Z

52 votes

import binascii

binary_string = binascii.unhexlify(hex_string)

binascii.unhexlify

返回由指定为参数的十六进制字符串表示的二进制数据。

rahul answered 2019-09-14T20:22:45Z

40 votes

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

Glenn Maynard answered 2019-09-14T20:23:02Z

29 votes

>>> bin( 0xABC123EFFF )

'0b1010101111000001001000111110111111111111'

Simple answered 2019-09-14T20:23:26Z

24 votes

将hex转换为二进制

我有ABC123EFFF。

我想拥有001010101111000001001000111110111111111111(即二进制文件  再版。 比方说,42位数和前导零。

简短回答:

Python 3.6中的新f字符串允许您使用非常简洁的语法执行此操作:

>>> 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

现在我们需要用二进制表示来表示整数。

使用内置函数,int.to_bytes

然后传递给int.to_bytes:

>>> 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

字符串格式(模板),int.to_bytes

我们可以使用int.to_bytes方法在字符串中使用它:

>>> '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'

Aaron Hall answered 2019-09-14T20:26:37Z

13 votes

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

Markus answered 2019-09-14T20:26:54Z

9 votes

这是使用bit fiddling生成二进制字符串的一种相当原始的方法。

要理解的关键点是:

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

如果设置n的第i位,则将生成0或1。

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

编辑:使用“new”三元运算符:

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

会成为:

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

(哪个TBH我不确定它的可读性如何)

John Montgomery answered 2019-09-14T20:27:49Z

5 votes

这是对Glen Maynard解决方案的轻微修改,我认为这是正确的方法。 它只是添加了填充元素。

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,。

RobotHumans answered 2019-09-14T20:28:20Z

4 votes

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

'1010101111000001001000111110111111111111'

`bin(int("abc123efff", 16))[2:].zfill(50)`

'00000000001010101111000001001000111110111111111111'

(编号50将告诉zfill您要用零填充字符串,直到字符串长度为50。)

Paulo answered 2019-09-14T20:28:45Z

2 votes

十六进制 - >十进制再十进制 - >二进制

#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))

answered 2019-09-14T20:29:09Z

2 votes

用相应的4位二进制数字替换每个十六进制数字:

1 - 0001

2 - 0010

...

a - 1010

b - 1011

...

f - 1111

DmitryK answered 2019-09-14T20:29:33Z

1 votes

其他方式:

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')

ChristopheD answered 2019-09-14T20:29:53Z

0 votes

我添加了要填充到Onedinkenedi解决方案的位数的计算。 这是结果函数:

def hextobin(h):

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

其中16是您要转换的基数(十六进制),4是您需要表示每个数字的位数,或者是数字的对数基数2。

Edd answered 2019-09-14T20:30:25Z

0 votes

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

Harshit Gupta answered 2019-09-14T20:30:43Z

0 votes

我有一个短暂的希望帮助:-)

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 :-)

简短列表列出了连接方法。 请享用。

John answered 2019-09-14T20:31:21Z

-1 votes

a = raw_input('hex number\n')

length = len(a)

ab = bin(int(a, 16))[2:]

while len(ab)

ab = '0' + ab

print ab

Ashwini answered 2019-09-14T20:31:39Z

-1 votes

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"""

khattanemu answered 2019-09-14T20:31:57Z

-8 votes

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

l=l+convert(no[b])

b+=1

print l

warunn answered 2019-09-14T20:32:15Z

你可能感兴趣的:(python十六进制转换成二进制_python - 将十六进制转换为二进制)