我试图获取一个字符串jJ
作为输入,然后使用a中给出的映射将每个字符转换为6位二进制形式,并将它们连接起来并在mapFirst(string)
中返回。也就是说,jJ
变成100011001001
。
在binaryToLetter(string)
中,我将返回的值分成8位,然后将其转换回其字符形式并连接起来。 100011001001
变为00001000
和11001001
,然后将其转换并合并为(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()
答案 0 :(得分:0)
我设法得到了一些工作。对于第一部分:
def mapFirst(string):
return ''.join(bin(a.index(c))[2:].zfill(6) for c in string)
我消除了很多不必要的混乱:
ord(chr(x)) == x
(假设x:int <256),因为ord
是chr
的倒数。str(bin(x)) == bin(x)
,因为bin
已经返回了一个字符串。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)]))
将其分解:
range(len(binNew), -1, -8)
以-8的步长将序列从len(binNew)
减小到0(含)。binNew
获取8位长块,并确保我不会超出最后一个(max()
的含义)。 int(..., 2)
将这8个字符字符串转换为数字,并将该数字转换为chr
。reversed
不接受生成器,因此我将原始生成器更改为一个列表。