2012-02-14 2 views
3

은 8자를 나눌 필요가있어서 목록으로 만들어서 ascii로 변환 한 다음 영어로 변환 할 수 있습니다. 방금 입력 한 문자열 (하나의 큰 이진수 문자열)을 단 하나의 문자열 대신 읽을 수있는 이진수로 분할하는 방법에 대한 손실이 있습니다.Python : 이진 코드의 입력을 공백없이 나누는 데 도움이 필요합니다.

예를 들어 입력 문자열 "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() 
+1

글쎄, 뭐가 문제 야? (귀하의 출력 및 예상 출력을 고려하십시오) – Arafangion

+0

입력을 분할하지 않습니다, 나에게 문자의 엉망을 제공합니다. –

답변

5

이 지능형리스트와 함께, 당신에게 몇 가지 방법을 도움이 될 것입니다

>>> 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 
+0

괜찮습니다, 지금은 어떻게 설정하는 지보기 시작했습니다, 정말 고마워요! –

+0

좋아, 이거 잘 해냈어. 고마워. 모두가 나를 더 많이 보게 될 것이고, 저는 파이썬에 대해 아주 새로운 것입니다. –

2
>>> re.findall('[01]{8}', '010000010100001001000011') 
['01000001', '01000010', '01000011'] 
>>> ''.join(chr(int(x, 2)) for x in re.findall('[01]{8}', '010000010100001001000011')) 
'ABC' 
+0

고마워, 네가 네 줄에서 모두 멋지다, 나는 이것에 대해 좀 더 자세하게 살펴볼 것이다. 'findall'이 유용 할 것 같다. –

+5

@ user1208098 : 실제로 한 줄입니다. –

2

난 당신이, 당신 아마 가치이 원하는 확실하지 않다 그것 :

>>> 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'] 

Ignacio, 나는 자야 해.

+0

나누면, 기억해야합니다 ... –

+0

그것은 정수 나누기 연산자로, 기억할 필요가 없습니까? – tito

+0

잊어 버렸기 때문에 대답이 잘못되었습니다. –

0

나는 당신의 질문을 이해 잘 모르겠지만, 당신이하려고하는 것 같다 다음 문자열을 감안할 때 길이 8n 인 경우 8 진수의 각 청크를 (유니 코드) 문자열로 변환 한 다음 결과 문자열을 공백없이 결합하십시오.

이 사건을 경우,이 트릭 할 것입니다 :

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' 

편집 : 당신은 언급을 "내가 그들 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)에서만 유효합니다.

+0

몇 가지 다른 답변과 마찬가지로 잘못된 결과가 나타납니다. – senderle

+0

괜찮아. 나는 끝까지 그들을 가입하고 싶지 않다. 내가하고 싶은 것은 그것들을 나누어서 ascii와 영어 문자로 가져갈 수 있어야한다는 것입니다. 그걸 정리 해줄거야? –

+0

알겠습니다. 이해해 주셔서 감사합니다. –

관련 문제