ValueError在Python中以2为底的int()的无效文字

时间:2019-05-13 19:09:45

标签: python python-3.x binary

我试图获取一个字符串jJ作为输入,然后使用a中给出的映射将每个字符转换为6位二进制形式,并将它们连接起来并在mapFirst(string)中返回。也就是说,jJ变成100011001001

binaryToLetter(string)中,我将返回的值分成8位,然后将其转换回其字符形式并连接起来。 100011001001变为0000100011001001,然后将其转换并合并为(backspace)É

在我的代码中,我得到了错误消息:

Exception has occurred: ValueError
invalid literal for int() with base 2: ''

  File "C:\Users\Sembian\Desktop\exc files new\Ex_Files_Learning_Python\Exercise Files\task_cs\task1.py", line 11, in <genexpr>
    return ''.join( str( int( (binNew[newLen:newLen-i]),2 ) ).replace('0b','').zfill(8) for i in range(0, newLen, n) )

我使用的代码是:

from textwrap import wrap
a = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/']

def mapFirst(string):
   return ''.join(str(bin(ord(chr(a.index(c))))).replace('0b','').zfill(6) for c in string)

def binaryToLetter(binNew):
   newLen = len(str(binNew))          
   n=8
   return ''.join( str( int( (binNew[newLen:newLen-i]),2 ) ).replace('0b','').zfill(8) for i in range(0, newLen, n) )

def main():
   k = 'jJ'
   print("the first binary value is: ",mapFirst(k))
   print("the final decoded value is: ", binaryToLetter(mapFirst(k)))

if __name__ == "__main__":
  main()

1 个答案:

答案 0 :(得分:0)

我设法得到了一些工作。对于第一部分:

def mapFirst(string):
   return ''.join(bin(a.index(c))[2:].zfill(6) for c in string)

我消除了很多不必要的混乱:

  1. ord(chr(x)) == x(假设x:int <256),因为ordchr的倒数。
  2. str(bin(x)) == bin(x),因为bin已经返回了一个字符串。
  3. bin(x).replace('0b', '') == bin(x)[2:],因为bin将始终返回以0b开头的字符串,因此您可以使用字符串(列表)切片。

第二部分:

def binaryToLetter(binNew):
   return ''.join(reversed([chr(int(binNew[max(0, i - 8):i], 2))
                            for i in range(len(binNew), 0, -8)]))

将其分解:

  1. 我正在使用range(len(binNew), -1, -8)以-8的步长将序列从len(binNew)减小到0(含)。
  2. 然后,我再次使用列表切片从binNew获取8位长块,并确保我不会超出最后一个(max()的含义)。
  3. 我正在使用int(..., 2)将这8个字符字符串转换为数字,并将该数字转换为chr
  4. 因为我要从背面开始“切掉” 8个长子串,所以我需要颠倒顺序。但是reversed不接受生成器,因此我将原始生成器更改为一个列表。