아래는 이진 파일을 쓰는 파이썬 코드와 실행하는 방법입니다.
주어진 문자열의 길이가 설정된 길이 보다 작을 때 그 나머지 값에 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
댓글
댓글 쓰기