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]
.
我觉得真的很蠢,我只是需要听别人说,结果以我无穷的智慧证明,我只是尝试打开没有实际隐藏数据的图像。但我确实按照其他用户的建议修复了我的代码。感谢你们所做的一切!
我的程序有一些问题,基本上我想做的是速记,将一个图像插入另一个图像,然后提取秘密图像。
我的程序能够正常插入,但提取它时出现此错误。
前几天工作正常,我能够完美地读写。我也使用与前几天相同的 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]
.
我觉得真的很蠢,我只是需要听别人说,结果以我无穷的智慧证明,我只是尝试打开没有实际隐藏数据的图像。但我确实按照其他用户的建议修复了我的代码。感谢你们所做的一切!