为什么我得到一个IndexError:字符串索引超出范围?

时间:2012-04-04 05:31:36

标签: python string

我在ubuntu 11.10,python 2.7.2+上运行以下代码。

import urllib
import Image
import StringIO
source = '/home/cah/Downloads/evil2.gfx'
dataFile = open(source, 'rb').read()
slicedFile1 = StringIO.StringIO(dataFile[::5])
slicedFile2 = StringIO.StringIO(dataFile[1::5])
slicedFile3 = StringIO.StringIO(dataFile[2::5])
slicedFile4 = StringIO.StringIO(dataFile[3::5])
jpgimage1 = Image.open(slicedFile1)
jpgimage1.save('/home/cah/Documents/pychallenge12.1.jpg')
pngimage1 = Image.open(slicedFile2)
pngimage1.save('/home/cah/Documents/pychallenge12.2.png')
gifimage1 = Image.open(slicedFile3)
gifimage1.save('/home/cah/Documents/pychallenge12.3.gif')
pngimage2 = Image.open(slicedFile4)
pngimage2.save('/home/cah/Documents/pychallenge12.4.png')

本质上我正在使用.bin文件,其中包含多个图像文件的十六进制代码 喜欢123451234512345 ......然后聚在一起然后保存。问题是我收到以下错误:

File "/usr/lib/python2.7/dist-packages/PIL/PngImagePlugin.py", line 96, in read
len = i32(s)
File "/usr/lib/python2.7/dist-packages/PIL/PngImagePlugin.py", line 44, in i32
return ord(c[3]) + (ord(c[2])<<8) + (ord(c[1])<<16) + (ord(c[0])<<24)
IndexError: string index out of range

我找到了PngImagePlugin.py并且我看了它的内容:

def i32(c):

    return ord(c[3]) + (ord(c[2])<<8) + (ord(c[1])<<16) + (ord(c[0])<<24) (line 44)

"Fetch a new chunk. Returns header information."

    if self.queue:
        cid, pos, len = self.queue[-1]
        del self.queue[-1]
        self.fp.seek(pos)
    else:
        s = self.fp.read(8)
        cid = s[4:]
        pos = self.fp.tell()
        len = i32(s) (lines 88-96)

我会尝试修修补补,但我担心我会搞砸png和PIL,这些都很有效。

感谢

2 个答案:

答案 0 :(得分:3)

在此阶段似乎len(s) < 4

len = i32(s)

这意味着

s = self.fp.read(8)

不读取整个4个字节

可能你传递的fp中的数据对图像解码器没有意义。

仔细检查您是否正确切片

答案 1 :(得分:-1)

确保您传入的字符串长度至少为4。