ValueError недопустимый литерал для int () с основанием 2: '' в Python - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь получить строку jJ в качестве входных данных, а затем преобразовываю каждый символ в его 6-битную двоичную форму, используя сопоставление, данное в a, и объединяю их и возвращаю в 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()

1 Ответ

0 голосов
/ 13 мая 2019

Мне удалось заставить что-то вроде работать. Для первой части:

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

Я удалил кучу ненужных беспорядков:

  1. ord(chr(x)) == x (при условии x: int <256), поскольку <code>ord является обратным chr.
  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), чтобы сгенерировать уменьшение последовательности от len(binNew) до 0 (включительно) с шагом -8.
  2. Затем я снова использую нарезку списка, чтобы получить 8-битные длинные чанки из binNew, убедившись, что я не превышаю последний (то, для чего max()).
  3. Я превращаю эти 8 строк в число с помощью int(..., 2) и превращаю это число в chr.
  4. Поскольку я «обрезаю» 8 длинных подстрок, начиная со спины, мне нужно изменить порядок. Но reversed не принимает генераторы, поэтому я заменяю оригинальный генератор на список.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...