2016-06-02 6 views
2

В настоящее время я пишу конвертер ascii-binary/binary-ascii в Python для школьного проекта, и у меня есть проблема с преобразованием из ascii (String text) в двоичный. Идея состоит в том, чтобы напечатать результат в тесте() в нижней части кода.Преобразование двоичных файлов в ASCII и ASCII в двоичный файл

При выполнении кода в WingIDE, возникает ошибка: На линии, начиная с

bnary = bnary + binary[chnk] 

KeyError: «Норвегия электрошокового Польша 30:28 и испортит день рождения Белецкого в.»

То, что я пытаюсь сделать здесь, чтобы преобразовать строку текста, хранящегося в «text.txt» в строку целых чисел, а затем распечатать эту бинарную строку.

Любая помощь очень ценится. Я попытался взглянуть на другие связанные с ascii-двоичным обращением вопросы, связанные с конверсией, но никто не работал для меня.

Мой код:

def code():  
    binary = {} 
    ascii = {} 

    # Generate ascii code 
    for i in range(0,128) : 
     ascii[format(i,'08b')] = chr(i) 


    # Reverse the ascii code, this will be binary 
    for k, v in ascii.iteritems(): 
     binary[v] = binary.get(v, []) 
     binary[v].append(k) 

    return ascii 

def encode(text,binary): 
    ''' 
    Encode some text using text from a source 
    ''' 
    bnary = "" 

    fi = open(text, mode='rb') 
    while True: 
     chnk = fi.read() 
     if chnk == '': 
      break 
     if chnk != '\n': 

      binry = "" 

      bnary = bnary + binary[chnk] 

     return bnary 

def decode(sourcecode,n, ascii): 
    ''' 
    Decode a sourcecode using chunks of size n 
    ''' 

    sentence = ""  

    f = open(sourcecode, mode='rb') # Open a file with filename <sourcecode> 
    while True: 
     chunk = f.read(n)   # Read n characters at time from an open file 
     if chunk == '':    # This is one way to check for the End Of File in Python 
      break 
     if chunk != '\n': 

      setence = ""   # The ascii sentence generated 

      # create a sentence 
      sentence = sentence + ascii[chunk] 

    return sentence 

def test(): 
    ''' 
    A placeholder for some test cases. 
    It is recommended that you use some existing framework, like unittest, 
    but for a temporary testing in a development version can be done 
    directly in the module. 
    ''' 

    print encode('text.txt', code()) 
    print decode('sourcecode.txt', 8, code()) 

test() 
+0

FYI, "Норвегия электрошокового Польша 30:28 и испортить день рождения Белецкого в." это содержимое «text.txt». –

+3

Просьба уточнить, что такое преобразование между ASCII и двоичными средствами. Вы имеете в виду преобразование целого числа, сохраненного в двоичном формате, в его представление ASCII и обратно? Если да, то в какой базе в ASCII: двоичный, десятичный или другой? Если не так, то что вы имеете в виду? (Я прошу это перед чтением вашего кода, так как эти вопросы имеют основополагающее значение для оценки вашего кода.) –

+0

Преднамеренно ли у вас есть 'двоичный',' bnary' и 'binry' в вашем методе' encode'? –

ответ

3

Если вы хотите, чтобы кодировать и декодировать, имеют эти решения

Encode ASCII в бункер

def toBinary(string): 
    return "".join([format(ord(char),'#010b')[2:] for char in string]) 

Encode бен ASCii

def toString(binaryString): 
    return "".join([chr(int(binaryString[i:i+8],2)) for i in range(0,len(binaryString),8)]) 
+1

Спасибо, это сработало как шарм! оценил. –

+0

@MortenAmundsen: В дополнение к принятию наиболее полезного ответа (который вы сделали), вы также должны перенести все хорошие ответы, в том числе, конечно, принятые. Это полный способ выразить признательность здесь. –

1

fi.read() возвращает весь документ в первый раз, и '' следующий раз. Таким образом, вы должны сделать

text = fi.read() 
for char in text: 
    do_stuff() 

edit1

Вы можете только читать файл один раз. Таким образом, вы должны получать свои символы один за другим. Файл file.read возвращает строку, содержащую весь документ.

Вы можете перебирать строку, чтобы получить символы по одному.

Основная ошибка вашего binary является {"a":['010001110'], "b":...} и вы пытаетесь получить доступ с помощью ключа "azerty", где вы должны сделать это обугливается на гольца:

string = "azer" 
result = [] 
for c in string: 
    result += binary[c] 

>>> result = [['11001'],[1001101'],...] 
+0

Пробовал Ваше предложение: 'Def закодировать (текст, двоичный): bnary = "" Fi = открытый (текст, режим = 'гь') то время как True: текст = fi.read() для полукокса в тексте: binry = "" bnary = bnary + бинарный [текст] возвращение bnary' Я все еще получаю ту же ошибку, как и раньше; «KeyError:« Норвегия оглушает Польшу 30:28 (...) » –

+0

У вас больше ошибок, чем в вашей программе, но давайте шаг за шагом. – Paul

1
# Lets say your filename is stored in fname 

def binary(n): 
    return '{0:08b}'.format(n) 

with open(fname) as f: 
    content = f.readlines() 
    for i in content: 
     print(binary(ord(i)), end='') 
    print('') 

Это даст вам целое значение (от ASCII) каждого символа в файле, построчно

+0

Проверьте эту ссылку для части формата (n): http: // stackoverflow .com/questions/10411085/converting-integer-to-binary-in-python –

+0

или создать свою собственную двоичную функцию, которая принимает целое число в качестве входных данных и возвращает бинарный эквивалент. –

Смежные вопросы