【问题标题】:Python invalid literal for int() with base 2以 2 为基数的 int() 的 Python 无效文字
【发布时间】:2017-05-29 20:19:13
【问题描述】:

我正在尝试一个简单的隐写 python 程序。编码有效,但出现错误 ValueError: invalid literal for int() with base 2: '0b#99c1f#...... 该值应该是二进制的,我找不到错误。我正在使用 python 2.7 这是代码:

from PIL import Image
import binascii
import optparse


def rgb2hex(r,g,b):
    return '#{:02x}{:02x}{:02x}'.format(r,g,b)


def hex2rgb(hexcode):
    return tuple(map(ord,hexcode[1:].decode('hex')))


def str2bin(message):
    binary = bin(int(binascii.hexlify(message), 16))
    return binary[2:]


def bin2str(binary):
    message = binascii.unhexlify('%x' %(int('0b' + binary, 2)))
    return message


def encode(hexcode, digit):
    if hexcode[-1] in ('0', '1', '2', '3', '4', '5'):
        hexcode = hexcode[:-1]+digit
        return hexcode
    else:
        return None


def decode(hexcode):
    if(hexcode[-1] in ('0','1')):
        return hexcode[:-1]
    else:
        return None


def hide(filename, message):
    img = Image.open(filename)
    binary = str2bin(message) + '1111111111111110'
    if img.mode in ('RGBA'):
        img = img.convert('RGBA')
        datas = img.getdata()

        newData = []
        digit = 0
        temp = ''
        for item in datas:
            if (digit < len(binary)):
                newpix = encode(rgb2hex(item[0], item[1], item[2]), binary[digit])
                if newpix == None:
                    newData.append(item)
                else:
                    r,g,b = hex2rgb(newpix)
                    newData.append((r,g,b,255))
                    digit += 1

            else:
                newData.append(item)

        img.putdata(newData)
        img.save(filename, "bmp")
        return "Completed!"
    return "Incorrect Image mode"


def retr(filename):
    img = Image.open(filename)
    binary = ''

    if img.mode in ('RGBA'):
        img = img.convert('RGBA')
        datas = img.getdata()

        for item in datas:
            digit = decode(rgb2hex(item[0], item[1], item[2]))
            if digit == None:
                pass
            else:
                binary = binary + digit
                if (binary[-16:] == '1111111111111110'):
                    print "Success"
                    return bin2str(binary[:-16])

        return bin2str(binary)

    return "incorrect image mode"


def Main():

    parser = optparse.OptionParser('usage %prog -e/-d <target file>')
    parser.add_option('-e', dest='hide', type='string', help='target picture')
    parser.add_option('-d', dest='retr', type='string', help='target picture')

    (options, args) = parser.parse_args()
    if options.hide != None:
        text = raw_input("Enter a message: ")
        print hide(options.hide, text)

    elif options.retr != None:
        print retr(options.retr)

    else:
        print parser.usage
        exit(0)


Main()

【问题讨论】:

  • 您可能将 rgb2hex 的结果传递给您的函数。打印你会发现问题的各种局部变量...

标签: python binascii


【解决方案1】:

此行导致错误:

binary = binary + digit

在那里,digit 是一个具有十六进制值的字符串(例如#003f7),您将它与应该是二进制字符串的内容连接起来(但实际上类似于:#003f7#003f7...)。然后将该值传递给bin2str()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2013-07-27
    • 2015-10-15
    • 1970-01-01
    相关资源
    最近更新 更多