ValueError: invalid literal for int() with base 10: ' ' when it worked before

ValueError: invalid literal for int() with base 10: ' ' when it worked before

我的程序有一些问题,基本上我想做的是速记,将一个图像插入另一个图像,然后提取秘密图像。

我的程序能够正常插入,但提取它时出现此错误。

前几天工作正常,我能够完美地读写。我也使用与前几天相同的 BMP 图像。有人知道这个问题吗?我没有从它的工作状态更改任何代码,我什至上传到 github 以确保该版本有效。

我的 github 上有 3 个代码文件。

https://github.com/am3ience/Steganography/blob/master/dcstego.py

https://github.com/am3ience/Steganography/blob/master/dcimage.py

https://github.com/am3ience/Steganography/blob/master/dcutils.py

问题似乎出现在我的读取函数 dcutils.py 中。任何帮助都会很棒,我很难过。

#examine the lsb of each pixel, grouping into bytes
#check for nulls to signify if we are dealing with data or header info
#bytes determined to be data result in the hidden file
#---------------------------------------------------------------
def read(mainimage, output, password):
    lsbByte_Array = []
    dataString = ""
    secretFileName = ""
    lsbString = ""
    count = 0#iterator
    headerReceived=0#flags
    sizeReceived=0
    imageObject = dcimage.openFile(mainimage)
    pixels = imageObject.load()
    imageWidth, imageHeight = imageObject.size

    #cycle through each pixel
    for x in range(imageWidth):
        for y in range(imageHeight):
            r, g, b = pixels[x, y]
            #trim so we are dealing with only the least significant bit
            redPixel = str(bin(r)[2:].zfill(8))[7]
            greenPixel = str(bin(g)[2:].zfill(8))[7]
            bluePixel = str(bin(b)[2:].zfill(8))[7]
            secretBits = [redPixel, greenPixel, bluePixel]

            #for each of rgb
            for i in range(0,3):
                #check if our flags are set
                if (headerReceived == 0 or sizeReceived == 0):
                    lsbString += secretBits[i]

                    #verify each byte
                    if len(lsbString) == 8:
                        lsbByte_Array.append(lsbString)

                        #check if we have received a NULL byte
                        if lsbString == "00000000":
                            if headerReceived == 0:

                                #convert the the bit array into an ascii String
                                #set flag when header and size was received
                                fileName = ''.join(binascii.unhexlify('%x' % int(b,2)) for b in lsbByte_Array[0:len(lsbByte_Array) - 1])
                                print "File name: " + str(fileName)
                                headerReceived = 1
                            elif sizeReceived == 0:
                                 fileSize = ''.join(binascii.unhexlify('%x' % int(b,2)) for b in lsbByte_Array[0:len(lsbByte_Array) - 1])
                                print "File size: " + fileSize
                                sizeReceived=1

                            #reset the values
                            lsbByte_Array = []
                        lsbString = ""

                #once headers received, resulting data is hidden data
                elif (headerReceived == 1 and sizeReceived == 1):
                    if int(count) < int(fileSize):
                        #keep appending secret bits to the dataString until depleted
                        dataString += secretBits[i]
                        count += 1
                    else:
                        #send to have hidden file created
return dcimage.saveImage(output, dataString)
fileSize = ''.join(binascii.unhexlify('%x' % int(b,2)) for b in 
                   lsbByte_Array[0:len(lsbByte_Array) - 1])

如果 lsbByte_Array 是一个空数组,那么 fileSize 将是一个空字符串,这显然是 int(fileSize) 失败的原因。

您可能应该使用默认值,例如

fileSize = ''.join(binascii.unhexlify('%x' % int(b,2)) for b in 
                   lsbByte_Array[0:len(lsbByte_Array) - 1]) or 0

作为旁注,像 lsbByte_Array[0:len(lsbByte_Array) - 1]) 这样的东西可以简单地写成 lsbByte_Array[0:-1].

我觉得真的很蠢,我只是需要听别人说,结果以我无穷的智慧证明,我只是尝试打开没有实际隐藏数据的图像。但我确实按照其他用户的建议修复了我的代码。感谢你们所做的一切!