gpt4 book ai didi

python - pickle.load - EOFError : Ran out of input

转载 作者:行者123 更新时间:2023-12-04 12:45:38 31 4
gpt4 key购买 nike

我有一个 .obj文件中,以前我将图像转换为 base64 并使用 pickle 保存.

问题是当我尝试加载 .obj 时文件与 pickle ,将代码从base64转成图片,用pygame加载.

加载图像的函数:

def mainDisplay_load(self):
main_folder = path.dirname(__file__)
img_main_folder = path.join(main_folder, "sd_graphics")

# loadImg
self.mainTerminal = pg.image.load(path.join(img_main_folder, self.main_uncode("tr.obj"))).convert_alpha()

解码文件的函数:
def main_uncode(self, object):
openFile = open(object, "rb")
str = pickle.load(openFile)
openFile.close()
fileData = base64.b64decode(str)
return fileData

运行代码时出现的错误:
str = pickle.load(openFile)

EOFError: Ran out of input



我该如何解决?
  • Python 版本:3.6.2
  • Pygame 版本:1.9.3

  • 更新 1

    这是我用来创建 .obj 的代码文件:
    import base64, pickle

    with open("terminal.png", "rb") as imageFile:
    str = base64.b64encode(imageFile.read())
    print(str)

    file_pi = open("tr.obj","wb")
    pickle.dump(str,file_pi)
    file_pi.close()

    file_pi2 = open("tr.obj","rb")
    str2 = pickle.load(file_pi2)
    file_pi2.close()

    imgdata = base64.b64decode(str2)
    filename = 'some_image.jpg' # I assume you have a way of picking unique filenames
    with open(filename, 'wb') as f:
    f.write(imgdata)

    创建文件后,将加载它并创建第二个图像。这是为了检查图像是否相同或转换中有错误。

    如您所见,我使用了部分代码来加载图像,但没有保存,而是加载到 pygame 中。 .这就是错误发生的地方。

    更新 2

    我终于设法解决了它。

    在主要代码中:
    def mainDisplay_load(self):
    self.all_graphics = pg.sprite.Group()
    self.graphics_menu = pg.sprite.Group()

    # loadImg
    self.img_mainTerminal = mainGraphics(self, 0, 0, "sd_graphics/tr.obj")

    在包含图形类的库中:
    import pygame as pg
    import base64 as bs
    import pickle as pk
    from io import BytesIO as by
    from lib.setting import *

    class mainGraphics(pg.sprite.Sprite):
    def __init__(self, game, x, y, object):
    self.groups = game.all_graphics, game.graphics_menu
    pg.sprite.Sprite.__init__(self, self.groups)
    self.game = game
    self.object = object
    self.outputGraphics = by()

    self.x = x
    self.y = y

    self.eventType()

    self.rect = self.image.get_rect()
    self.rect.x = self.x * tilesizeDefault
    self.rect.y = self.y * tilesizeDefault

    def eventType(self):
    openFile = open(self.object, "rb")
    str = pk.load(openFile)
    openFile.close()
    self.outputGraphics.write(bs.b64decode(str))
    self.outputGraphics.seek(0)
    self.image = pg.image.load(self.outputGraphics).convert_alpha()

    对于我为什么要这样做的问题,很简单:

    any attacker with sufficient motivation can still get to it easily



    Python 是免费和开放的。

    一方面,我们有一个人故意去修改和恢复隐藏的数据。但如果 Python 是一种开放语言,就像更复杂和 protected 语言一样,最有动力的人能够破解游戏或程序并检索相同的数据。

    另一方面,我们有一个只知道基础知识的人,甚至连基础知识都不知道。在不了解更多语言或解码文件的情况下无法访问文件的人。

    所以你可以理解,从我的角度来看,解码文件不需要受到有动机的人的保护。因为即使使用更复杂和 protected 语言,那个有动力的人也能得到他想要的。该保护用于不了解该语言的人。

    最佳答案

    所以,如果你得到的错误确实是“pickle: run out of input”,那可能意味着你在上面的代码中弄乱了你的目录,并试图读取一个与你的 obj 同名的空文件。文件是。

    实际上,代码中的这一行是这样的:

    self.mainTerminal=pg.image.load(path.join(img_main_folder,self.main_uncode
    ("tr.obj"))).convert_alpha()

    完全搞砸了。只需阅读它,您就会发现问题所在:您正在传递给 main_uncode方法只是文件名,没有目录信息。然后,如果它偶然起作用,正如我前段时间在评论中指出的那样,您将尝试使用未序列化的图像数据作为文件名,从中读取图像。 (您或其他人可能认为 main_uncode 应该写入一个临时图像文件并将图像数据写入该文件,以便 Pygame 可以读取它,但实际上,它只是以字符串形式返回原始图像数据) .

    因此,通过修复上述调用并将实际路径传递给 main_uncode ,并进一步修改它以将临时数据写入文件并返回其路径将修复上面的代码片段。

    第二件事是我根本不明白你为什么需要这个“.obj”文件。如果只是为了“通过默默无闻的安全”,人们让您的捆绑文件无法打开图像,那么这与推荐的做法相去甚远。总结一件事:它会延迟您的文件的合法使用(例如,您自己似乎无法使用它),而任何有足够动机的攻击者仍然可以轻松获得它。通过打开一个图像,base-64 编码并对其进行 pickle ,然后执行相反的过程,您基本上是在进行无操作。更重要的是,pickle 文件可以序列化并写入磁盘复杂的 Python 对象 - 但图像的 base64 序列化可以直接写入文件,而无需 pickle。

    第三件事:只需使用 with要打开所有文件,而不仅仅是您使用图像库读取的文件,请花点时间了解更多有关 Python 的知识。

    关于python - pickle.load - EOFError : Ran out of input,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47244350/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com