2012-03-01 3 views
2

나는 파랑의 값도 경우, 그것은 이진 문자열에서 0을 나타내는 그런 그림의 파란색 픽셀에서 숨겨진 메시지를 추출하려고 시도하고있어, 청색 값이 홀수 인 경우, 그것은 1을 나타냅니다 2 진 문자열. 8 비트 2 진 문자열은 각각 문자를 나타내며 함께 문자는 숨겨진 메시지가됩니다.파이썬에서 어떻게 8 비트 이진수를 ASCII 문자로 변환합니까?

나는 8 비트 바이너리 문자열로 전체 이진 문자열을 파괴했지만, 나는 ASCII 문자로 그 "덩어리"를 변환하는 방법에 대한 어떻게 가야하나요? chr() 및 ord() 및 unichr()이 작동하지 않는 것 같습니다. 8 비트 이진 하위 문자열을 해당 ASCII 문자로 직접 변환하는 데 사용할 수있는 메서드 또는 함수가 있습니까? 아니면 문자열을 수동으로 변환해야합니까?

import Image 

def chunks(s, n): 
    for start in range(0, len(s), n): 
     yield s[start:start+n] 

image = Image.open('image.png') 
imagePixels = image.load() 
imageWidth = image.size[0] 
imageHeight = image.size[1] 
blueValueEightString = "" 

for y in range(imageHeight): 
    for x in range(imageWidth): 
     blueValue = imagePixels[x, y][2] 

     if blueValue%2 == 0: 
      blueValue = 0 
     else: 
      blueValue = 1 

     blueValueString = str(blueValue) 
     blueValueEightString += blueValueString 

for chunk in chunks(blueValueEightString, 8): 
    print chunk 
+4

당신은 ASCII로 8 비트 숫자를 변환 할 수 없습니다 : 당신은 7 비트 숫자 만 변환 할 수 있습니다. ASCII는 8 비트를 보유하지 않습니다. – tchrist

답변

9

먼저 정수로 변환해야하고, 다음 값으로 풀어서 ASCII 문자를 얻을 수 chr()를 사용할 수 있습니다

>>> binary_string = '01110111' 
>>> int(binary_string, 2) 
119 
>>> chr(int(binary_string, 2)) 
'w' 
+1

문자열을 만들고 함께 결합하고 다시 숫자로 변환하는 대신에 'imagePixels'의 데이터를 0-255 범위의 숫자로 직접 변환하는 산술 연산을 사용하는 것이 훨씬 더 낫습니다. –

+0

몇 가지 예에서'int'를'2'의 밑으로 사용하는 것을 보았습니다. 왜 2의 밑을 사용하는 것이 합리적입니까? – Jarad

관련 문제