아래는 이진 파일을 쓰는 파이썬 코드와 실행하는 방법입니다.
주어진 문자열의 길이가 설정된 길이 보다 작을 때 그 나머지 값에 NULL을 채워 파일에 적기.
#! -*- Encoding: Latin-1 -*- import sys if __name__ == '__main__': if 4 == len(sys.argv): print 'file name = ' + str(sys.argv[1]) print 'offset = ' + str(sys.argv[2]) print 'string = ' + str(sys.argv[3]) f = open(sys.argv[1] , 'rb+') # 이진 파일 읽고 쓰기로 엽니다. f.seek(int(sys.argv[2]),1) # 파일의 현 위치에서 주어진 값 만큼 이동합니다.(양의 값이면 앞으로, 음의 값이면 뒤로) f.write(sys.argv[3]) # 파일에 문자열을 씁니다. f.close() # 파일을 닫습니다.
2011.02.23 : NULL값으로 패딩주어진 문자열의 길이가 설정된 길이 보다 작을 때 그 나머지 값에 NULL을 채워 파일에 적기.
str = sys.argv[3] if len(str) < 10: padding = '\0'*(10 - len(str)) # 정말 아름다운 코드입니다.^^ str = str + padding f.write(str)
또한 struct 모듈을 이용하여 데이타를 팩킹하여 저장 혹은 언팩킹하여 읽을 수 있습니다.import struct try: file.write(struct.pack('I', idx)) # unsigned int 데이터 저장 data = struct.pack('ffff', self.color[0], self.color[1], self.color[2], 1) # 4개의 float 데이터 저장 file.write(data) data = struct.pack('I', len(self.vertices)) file.write(data) data = struct.pack('I', len(self.triangles)) file.write(data) for idx in range(len(self.vertices)): data = struct.pack('fff', self.vertices[idx][0], self.vertices[idx][1], self.vertices[idx][2]) file.write(data) for id in self.triangles: data = struct.pack('H', id) # unsigned short 데이터 저장 file.write(data)
파일에서 데이타를 읽은 후 언팩킹하여 값을 가져올 수 있습니다.with open(file_path, mode='rb') as file: # b is important -> binary data = file.read() # 파일에서 모든 데이타를 읽는다 version = struct.unpack('I', data[:4]) # 4바이트를 가져와 unsigned int 형으로 변환한다 pos = 4 # structure structure_cnt, pos = struct.unpack('I', data[pos:pos + 4]), pos + 4 for idx in range(structure_cnt[0]): index, pos = struct.unpack('I', data[pos:pos + 4]), pos + 4 type_, pos = struct.unpack('I', data[pos:pos + 4]), pos + 4 name_len, pos = struct.unpack('I', data[pos:pos + 4]), pos + 4 bbox, pos = struct.unpack('ffffff', data[pos:pos + 4*6]), pos + 4*6 transform, pos = struct.unpack('ffffffffffffffff', data[pos:pos + 4 * 16]), pos + 4 * 16 prop_cnt, pos = struct.unpack('I', data[pos:pos + 4]), pos + 4 mesh_cnt, pos = struct.unpack('I', data[pos:pos + 4]), pos + 4 mesh_id, pos = struct.unpack('I', data[pos:pos + 4]), pos + 4 child_node_cnt, pos = struct.unpack('I', data[pos:pos + 4]), pos + 4 # up to here
댓글
댓글 쓰기