在Python中,如何将8位二进制数转换为它们对应的ASCII字符?

4
我正在尝试从一张图片的蓝色像素中提取隐藏信息,如果蓝色值为偶数,则代表二进制字符串中的0,如果蓝色值为奇数,则代表二进制字符串中的1。每个8位二进制字符串都代表一个字符,这些字符组合在一起形成了一个隐藏信息。
我已将整个二进制字符串分解为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

5
你无法将8位数字转换为ASCII码:你只能将7位数字转换为ASCII码。 ASCII码不包含8个位。 - tchrist
1个回答

13
你需要先将其转换为整数,然后才能使用chr()来获得与该值对应的ASCII字符:
>>> binary_string = '01110111'
>>> int(binary_string, 2)
119
>>> chr(int(binary_string, 2))
'w'

1
最好使用算术运算将imagePixels中的数据直接转换为0-255范围内的数字,而不是创建字符串、连接它们并将其转换回数字。 - Karl Knechtel
我现在已经看到了几个例子中使用了以2为基数的int。为什么使用基数为2是有意义的呢? - Jarad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接