2017-11-12 1 views
4

이전에 이미지를 base64로 변환하고 pickle으로 저장 한 .obj 파일이 있습니다.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

어떻게 해결할 수 있습니까?

  • 파이썬 버전 : 3.6.2
  • 파이 게임 버전 :

    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 파일을 만드는 데 사용되는 코드입니다

파일이 만들어지면 파일이로드되고 두 번째 이미지가 만들어집니다. 이는 이미지가 동일하거나 변환에 오류가 있는지 확인하는 것입니다.

이미지에서 볼 수 있듯이 코드를 사용하여 이미지를로드했지만 저장하는 대신 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

파이썬은 무료이며 공개되어 있습니다.

한편으로는 의도적으로 숨겨진 데이터를 수정 및 복구하는 사람이 있습니다. 그러나 파이썬이 더 복잡하고 보호 된 언어와 같이 공개 언어 인 경우, 동기 부여가 가장 큰 것은 게임이나 프로그램을 해독하고 동일한 데이터를 검색 할 수 있습니다.

반면에 우리에게는 기초 만 알고있는 사람이나 그렇지 않은 사람이 있습니다. 언어에 대해 모르고 파일을 해독하지 않고도 파일에 액세스 할 수없는 사람.

필자는 내 관점에서 보면 파일을 동기 부여 된 사람으로부터 보호 할 필요가 없음을 이해할 수 있습니다. 보다 복잡하고 보호 된 언어를 사용하더라도 동기 부여를받은 사람은 자신이 원하는 것을 얻을 수 있습니다. 보호는 언어에 대한 지식이없는 사람들에 대해 사용됩니다.

+0

'_load' 함수에 오류가있는 것 같습니다. 압축되지 않은 이미지 데이터를 폴더 이름과 연결하고 있습니까? 또한 도움이 필요한 경우 설명하는 대신 이러한 파일을 만드는 데 사용 된 코드를 게시 할 수 있습니다. 그렇듯이 상당히 번거로운 단계가있는 것처럼 보입니다. – jsbueno

+0

BTW, 당신이보고 한 오류는 위에서 언급 한 부분 앞에서 발생합니다. 오류도 마찬가지입니다. 문제는 파일을 만드는 중에 발생하는 것 같습니다. – jsbueno

+0

.obj 파일을 만드는 데 사용하는 코드를 추가했습니다. – BlackFenix06

답변

1

오류가 실제로 "피클 : 입력 부족"인 경우 해당 코드는 위의 코드에서 디렉토리를 엉망으로 만들었으며 obj 파일과 같은 이름의 빈 파일을 읽으려고합니다. 입니다. 그대로

사실, 코드에서이 라인 :

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

는 completly 엉망이다. 그냥 읽고 그것을 읽을 수 있습니다 : 당신은 디렉토리 정보없이 main_uncode 메서드에 파일 이름을 전달하고 있습니다. 그리고 나서, 우연한 일이 있었다면, 나는 잠시 전에 주석에서 언급했듯이, 이미지를 읽을 위치의 파일 이름으로 직렬화되지 않은 이미지 데이터를 사용하려고 시도 할 것입니다. (당신이나 다른 누군가는 아마도 main_uncode이 임시 이미지 파일을 작성하고 그 이미지 데이터를 써야한다고 생각했을 것입니다, 그래서 파이 게임은 그것을 읽을 수 있습니다,하지만 그것은 그대로 문자열의 원시 이미지 데이터를 반환합니다).

위의 호출을 수정하고 실제 경로를 main_uncode으로 전달하고 임시 데이터를 파일에 쓰고 경로를 반환하여 위의 코드 조각을 수정합니다.

두 번째로 나는 왜 ".obj"파일이 필요한지 알 수 없습니다. "안보를 통한 보안"을 위해 방금 사람들이 번들 파일을 가져 오는 것이 이미지를 열 수 없다면 그것은 권장 된 관행에서 멀리 떨어져있는 것입니다. 한 가지만 요약하면 파일의 합법적 인 사용이 지연됩니다 (자신처럼 사용할 수없는 것처럼 보임). 충분한 동기 부여가있는 공격자는 여전히 쉽게 접근 할 수 있습니다. 이미지를 열고, base-64 인코딩과 pickling을하고, reverse 프로세스를 수행하면 본질적으로 no-operation을 수행하게됩니다. 피클 파일은 복잡한 파이썬 객체를 직렬화하고 디스크에 쓸 수 있습니다. 그러나 이미지의 base64 직렬화는 파일에 직접 기록 할 수 있으며 피클을 사용할 필요가 없습니다.

세 번째 사항 : 이미징 라이브러리로 읽은 것뿐만 아니라 모든 파일을 열려면 with을 사용하십시오. 파이썬에 대해 조금 더 배우십시오.