2017-11-12 16 views
4

私は.objファイルを持っています。以前はbase64に画像を変換してpickleで保存しました。pickle.load - EOFError:入力が無効になった

pickle.objファイルをロードし、コードを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のバージョン:

    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) 
    
    :1.9.3

アップデート1

は、これは私が.objファイルを作成するために使用されるコードであります

ファイルが作成されると、ファイルがロードされ、2番目のイメージが作成されます。これは、画像が同じか、変換にエラーがあるかどうかを確認するためです。

ご覧のとおり、コードの一部を使用して画像をロードしましたが、保存する代わりに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がより複雑で保護された言語のようにオープンな言語である場合、最も意欲的なのは、ゲームやプログラムを解読して同じデータを取得することができます。

一方、私たちには、基礎のみを知っている人、あるいはそれ以外の人がいます。言語について詳しく知らずにファイルにアクセスできない人、またはファイルを解読する人。

私の視点から見ると、ファイルをデコードすることは、動機付けられた人から保護する必要はありません。より複雑で保護された言語でさえ、動機づけられた人は彼が望むものを手に入れることができるからです。保護は、言語を知らない人に対して使用されます。

+0

'_load'関数にエラーがあるようです - デコードされていないイメージデータをフォルダ名と連結していますか? また、意味のあるヘルプが必要な場合は、説明するだけでなく、これらのファイルの作成に使用したコードを投稿することもできます。 これは、かなり冗長な手順があるようです。 – jsbueno

+0

ところで、あなたが報告したエラーは、上記の部分の前に起こります。これもエラーになります。問題は、ファイルの作成中であるように見えます。 – jsbueno

+0

.objファイルの作成に使用するコードを追加しました。 – BlackFenix06

答えて

1

エラーが「pickle:input of run」である場合、上記のコードでディレクトリが混乱していることを意味し、objファイルと同じ名前の空のファイルを読み込もうとしていますです。そのまま

実際には、あなたのコード内でこの行:

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

はcompletly台無しにされています。ちょうどそれを読んで、あなたは問題を見ることができます:あなたはmain_uncodeメソッドにディレクトリ名のないファイル名だけを渡しています。そして、偶然にもうまくいけば、少し前にコメントを書いたように、画像をどこから読んだらファイル名としてシリアル化されていない画像データを使用しようとします。 (あなたや他の誰かが、おそらくmain_uncodeは一時的な画像ファイルを書き、それに画像データを書き込むべきだと考えていたので、Pygameはそれを読むことができましたが、それは文字列の生画像データを返すだけです)。

上記の呼び出しを修正し、実際のパスをmain_uncodeに渡してさらに変更して、一時データをファイルに書き込んでそのパスを返すと、上のコードスニペットが修正されます。

2番目のことは、なぜこの ".obj"ファイルが必要なのかわかりません。それが単なる "不明瞭なセキュリティ"のためのものであれば、あなたのバンドルされたファイルを取得する人はイメージを開くことができません、それは推奨される方法から遠いものです。ただ一つのことをまとめると、あなたのファイルの正当な使用を遅らせるでしょう(あなた自身はそれを使うことができないようです)。十分なモチベーションを持つ攻撃者はそれでも簡単に手に入ることができます。画像を開き、ベース64のエンコーディングとピクルス処理を行い、逆の処理を行うことで、本質的にノーオペレーションを行います。さらに、pickleファイルは、複雑なPythonオブジェクトを直列化してディスクに書き込むことができますが、イメージのbase64シリアル化はファイルに直接書き込むことができ、pickleを必要としません。

第3の事柄:イメージングライブラリで読んだだけでなく、すべてのファイルを開くにはwithを使用してください。少し時間をかけてPythonについて学んでください。

関連する問題