Python: нужна помощь для разделения ввода двоичного кода без пробелов - PullRequest
3 голосов
/ 14 февраля 2012

нужно разделить каждые 8 ​​символов, чтобы он стал списком, с помощью которого я мог бы затем перевести на ASCII, а затем на английский. Я просто в недоумении, как разбить входные данные (одну большую строку двоичных чисел) на читаемые двоичные числа вместо одной строки.

Например, входная строка «010000010100001001000011» может быть разбита на октеты следующим образом: «01000001», «01000010», «01000011».

Что у меня есть:

def main():
    import string

    #take user input of binary
    code = raw_input ('Please type in your binary code to be decoded: ')

    #split the code
    for word in code:
         print code[0::8] + ' '

    #replace the input with the variables
    ascii = ' '
    for word in code:
        ascii = ascii + int(word,2)

    english = ' '
    for word in acsii:
        english = english + chr(word)

    #print the variables to the user
    print english

#call Main
main()

Ответы [ 4 ]

5 голосов
/ 14 февраля 2012

Это должно помочь вам в понимании списка:

>>> b = '010000010100001001000011'
>>> bin_chunks = [b[8*i:8*(i+1)] for i in xrange(len(b)//8)]
>>> print bin_chunks
['01000001', '01000010', '01000011']
>>> ints = [int(x, 2) for x in bin_chunks]
>>> print ints
[65, 66, 67]
>>> chars = [chr(x) for x in ints]
>>> print chars
['A', 'B', 'C']
>>> print ''.join(chars)
ABC
2 голосов
/ 14 февраля 2012

Я не уверен, что ты хочешь этого, возможно, оно того стоит:

>>> s = "010000010100001001000011"
>>> [int(s[i:i+8], 2) for i in xrange(0, len(s), 8)]
[65, 66, 67]

Но если вы просто хотите использовать формат '01':

>>> s = "010000010100001001000011"
>>> [s[i:i+8] for i in xrange(0, len(s), 8)]
['01000001', '01000010', '01000011']

спасибо, Игнасио, я должен спать.

2 голосов
/ 14 февраля 2012
>>> re.findall('[01]{8}', '010000010100001001000011')
['01000001', '01000010', '01000011']
>>> ''.join(chr(int(x, 2)) for x in re.findall('[01]{8}', '010000010100001001000011'))
'ABC'
0 голосов
/ 14 февраля 2012

Я не уверен, что понимаю ваш вопрос, но, похоже, вы пытаетесь сделать следующее: Если задана строка длиной 8n, преобразуйте каждый кусок из 8 двоичных цифр в строку (Unicode), а затем присоединитесь к полученному строка без пробелов.

Если это так, то сработает:

stream = "010000010100001001000011"
grouped = [stream[n:n+8] for n in range(len(stream)/8)]
characters = [unichr(int(c, 2)) for c in grouped]
result = u"".join(characters)
# returns u'A\x82\x05'

Edit: Вы упоминаете «Я хочу их в ASCII, а затем английскими буквами», а затем делаете следующее:

ascii = [int(c, 2) for c in grouped] # this is a list of decimal ascii codes
english = [char(a) for a in ascii] # this is a list of characters - NOT UNICODE

но будьте осторожны, chr действителен только в диапазоне (256).

...