hex转换为二进制

我有ABC123EFFF。

我想要有001010101111000001001000111110111111111111(即二进制重新编码,比如说42位和前导零)。

怎么样?

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


my_hexdata = "1a" scale = 16 ## equals to hexadecimal num_of_bits = 8 bin(int(my_hexdata, scale))[2:].zfill(num_of_bits) 

它会给00011010,而不是修剪版本。

 import binascii binary_string = binascii.unhexlify(hex_string) 

binascii.unhexlify

返回指定为参数的hexstring表示的二进制数据。

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

'0b1010101111000001001000111110111111111111'

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

这是一个相当原始的方式来做到这一点使用位摆弄生成二进制string。

要理解的关键是:

 (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 

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

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

会成为:

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

(哪TBH我不确定这是多么可读)

将hex转换为二进制,42位数和前导零?

我们有几个直接的方法来实现这个目标,而不是使用切片的黑客。

首先,在我们可以做任何二进制操作之前,转换为int(我假设这是一个string格式,而不是文字):

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

最直接的答案:使用内置函数, format

然后传递给format

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

这使用格式规范的迷你语言 。 为了打破这个问题,下面是它的语法forms:

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

为了达到我们需求的规格:

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

string格式(模板)

我们可以使用str.format方法在一个string中使用str.format

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

或者直接把规范直接放在原始string中:

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

这对Glen Maynard的解决scheme有些微的影响,我认为这是正确的做法。 它只是添加了填充元素。

 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,

hex – >十进制,十进制 – >二进制

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

其他方式:

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

用相应的4个二进制数字replace每个hex数字:

 1 - 0001 2 - 0010 ... a - 1010 b - 1011 ... f - 1111 
 bin(int("abc123efff", 16))[2:] '1010101111000001001000111110111111111111' 

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

(数字50将告诉zfill你想用零zfillstring,直到string长度为50

我在Onedinkenedi解决scheme中添加了要填充的位数的计算。 这是由此产生的function:

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

其中16是您要转换的基础(hex),4是需要多less位来表示每个数字,或者是日志的基数2。

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

 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) 

首先我使用你的input并枚举它来获得每个符号。 然后我把它转换成二进制,并从第3个位置修剪到最后。 获得0的技巧是添加input的最大值 – >在这种情况下总是16 🙂

简短的forms是join方法。 请享用。

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