2015-01-14 1 views
1

Как проект из забавы, я хотел создать простой двоичный кодер с Python. После этого очень хорошо, я перешел к обновлению в качестве кодировщика и декодера ... и внезапно он не работает (только второй вариант, первый вариант все еще работает нормально).Как декодировать двоичный код в текст?

Я получаю ошибку, когда я хочу, чтобы расшифровать, например '0100 0001', которая выступает за "A", заключается в следующем:

Your message to decode: 0100 0010 
KeyError         Traceback (most recent call last) 
C:\Users\marco\AppData\Local\Enthought\Canopy32\App\appdata\canopy-1.4.0.1938.win-x86\lib\site-packages\IPython\utils\py3compat.pyc in execfile(fname, glob, loc) 
    195    else: 
    196     filename = fname 
--> 197    exec compile(scripttext, filename, 'exec') in glob, loc 
    198  else: 
    199   def execfile(fname, *where): 

C:\Users\marco\Dropbox\1_TUDelft\4Q\AE1205 Python\my own codes\binary encoder.py in <module>() 
    41  messageDecode = raw_input("Your message to decode: ") 
    42  for character in messageDecode: 
---> 43   print inverseBINARY[character], 

KeyError: '0' 

Я подозреваю, что это последняя команда, команда print, однако я не знаю, как исправить это ... Любые предложения?

Вот код:

BINARY = {"A":"0100 0001", 
"B":"0100 0010", 
"C":"0100 0011", 
"D":"0100 0100", 
"E":"0100 0101", 
"F":"0100 0110", 
"G":"0100 0111", 
"H":"0100 1000", 
"I":"0100 1001", 
"J":"0100 1010", 
"K":"0100 1011", 
"L":"0100 1100", 
"M":"0100 1101", 
"N":"0100 1110", 
"O":"0100 1111", 
"P":"0101 0000", 
"Q":"0101 0001", 
"R":"0101 0010", 
"S":"0101 0011", 
"T":"0101 0100", 
"U":"0101 0101", 
"V":"0101 0110", 
"W":"0101 0111", 
"X":"0101 1000", 
"Y":"0101 1001", 
"Z":"0101 1010", 
" ":"0100 0000", 
".":"0010 1110", 
",":"0010 1100", 
"?":"0011 1111"} 

inverseBINARY = {v:k for k,v in BINARY.items()} 

question = input("Do you wish to encode(press 1) or decode(press 2) into/from binary?") 

if question == 1: 
    messageEncode = raw_input("Your message to encode: ") 
    for character in messageEncode: 
     print BINARY[character.upper()], 

if question == 2: 
    messageDecode = raw_input("Your message to decode: ") 
    for character in messageDecode: 
     print inverseBINARY[character],  
+1

предположительно при вводе * «сообщение для декодирования» * вы делаете так, как, например, '' 0100 1000 0100 1001 "' - итерация по этому вопросу даст индивидуальные '' 1' '', '' '' '' '' '' '' и **, а не ** 9 символов в вашем словаре. – jonrsharpe

+0

ах! @jonrsharpe, который имел бы смысл. Я предполагаю, что тогда мне нужно собрать сначала девять символов, а затем перевести их как группу ... Может быть, предложение о том, как я буду заниматься этим? – user3604362

+0

Я бы начал с 'str.split'. Однако тот факт, что символ * внутри * каждой группы совпадает с символом * между * каждой группой, немного усложнит ситуацию. – jonrsharpe

ответ

-1

, если вы хотите, чтобы декодировать двоичный почему бы не использовать встроенные функции в качестве двоичного числа и chr?

>>> print chr(0b01000010) 
B 

EDIT

Хорошо тогда, это, как я бы решить, что:

from string import letters, punctuation 
encode_data = {letter:bin(ord(letter)) for letter in letters+punctuation+' '} 
decode_data = {bin(ord(letter)):letter for letter in letters+punctuation+' '} 

def encode(message): 
    return [encode_data[letter] for letter in message] 

def decode(table): 
    return [decode_data[item] for item in table] 

encoded = encode('hello there') 
print decode(encoded) # ['h', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'e', 'r', 'e'] 
+1

Конечно, но это не отвечает на вопрос. Это может быть добавление к правильному ответу (вот как вы это делаете правильно). –

-1

Чтобы преобразовать ASCII в двоичный:

>>> format(ord('A'), 'b') 
'1000001' 

Для преобразования двоичного файла в ASCII :

>>> chr(int('1000001',2)) 
'A' 

Вот более компактная версия кода:

question = raw_input("Your message to encode/decode: ") 

try: 
    question = int(question, 2) # Checks if inptu is binary. 
    print 'Decoding...' 
    print chr(question) 
except: 
    print 'Encoding...' 
    print "".join([format(ord(i), 'b') for i in question]) 

[тест]:

[email protected]:~$ python test.py 
Your message to encode/decode: 1000001 
Decoding... 
A 
[email protected]:~$ python test.py 
Your message to encode/decode: A 
Encoding... 
1000001 
+2

Это хорошо, но не ответ на вопрос. –

+1

Cant 'beat @martijnpieters в ответе на вопросы python;) – alvas

+0

Преобразование двоичного кода в ASCII binascii через представление двоичного кода в шестнадцатеричном формате вначале довольно круто. Почему бы не использовать 'chr (int (' 100001 ', 2))'? –

3

Вы зацикливание над отдельных символов сообщения ввода, но вам нужно вместо этого найдите группы из 9 символов (2 раза 4 двоичных цифры и пробел). Ваше отображение имеет ключи как '0100 1001', не '0' и '1' и ' '

Самый простой подход (хотя и немного хрупкие) будет перебрать индексы с шагом 10 символов (1 дополнительными для пространства между символами), а затем захватить 9 символов:

for i in xrange(0, len(messageDecode), 10): 
    group = messageDecode[i:i + 9] 
    print inverseBINARY[group],  

объект xrange() производит целые 10 друг от друга; так 0, 10, 20 и т.д. Строка messageDecode затем нарезанный захватить 9 символов, начиная с этого индекса, так и messageDecode[0:9]messageDecode[10:19], messageDecode[20:29] и т.д.

Более надежный подход заключается в том, чтобы удалить все пробелы и блоки захвата каждый символов; что бы оставить место для дополнительных пробелов между ними, но вы должны повторно вставить это пространство в соответствии с вашими ключами:

messageDecode = messageDecode.replace(' ', '') 
for i in xrange(0, len(messageDecode), 8): 
    group = messageDecode[i:i + 4] + ' ' + messageDecode[i + 4:i + 8] 
    print inverseBINARY[group],  

или вы могли бы, возможно, не включают в себя пробелы в вашем inverseBINARY отображения здесь:

inverseBINARY = {v.replace(' ', ''): k for k, v in BINARY.items()} 

, а затем просто нарезать каждые 8 ​​символов:

messageDecode = messageDecode.replace(' ', '') 
for i in xrange(0, len(messageDecode), 8): 
    group = messageDecode[i:i + 8] 
    print inverseBINARY[group], 
Смежные вопросы