저는 파이썬을 사용하여 바이너리 파일을 읽는 과정에서 혼란을 겪고 있습니다. 나는 둘 다 처음이에요. 그러니 나와 함께 견뎌주세요.파이썬을 사용하여 바이트 배열을 이진 파일로부터 언팩하는 방법은 무엇입니까?
파일 형식의 문서는 처음 16 바이트는 GUID 것을 알려줍니다 및 추가 읽기이 GUID 따라서 포맷 것을 저에게 말한다 :
typedef struct {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
byte Data4[8];
} GUID,
UUID,
*PGUID;
내가있어 지금까지 우리가 먼저 압축을 해제 할 수있는 구조체에 3 개의 엔트리가 있지만, # 4에서 난처한 상황에 처하게됩니다. 그것은 8 바이트 배열입니다.하지만 그것을 풀어 낼 방법이 확실하지 않습니다. 내가 DATA4 잘못 뭐하는 거지
import struct
fp = open("./file.bin", mode='rb')
Data1 = struct.unpack('<L', fp.read(4)) # unsigned long, little-endian
Data2 = struct.unpack('<H', fp.read(2)) # unsigned short, little-endian
Data3 = struct.unpack('<H', fp.read(2)) # unsigned short, little-endian
Data4 = struct.unpack('<s', bytearray(fp.read(8))) # byte array with 8 entries?
struct.error: unpack requires a bytes object of length 1
? (저는 파이썬 3.2 BTW를 사용하고 있습니다)
데이터 1부터 3까지는 OK입니다. 만약 내가 hex()을 사용한다면 정확한 데이터를 얻고있다. (woohoo) 나는이 바이트 배열의 구문에 대해 실패하고있다.
편집 : MS-DTYP에 정의 된이 그것을 못을 박았다 나는이 GUID를 읽고 있어요
답변 :
data = uuid.UUID(bytes_le=fp.read(16))
당신은 bytearray와 함께 struct를 사용하고 있습니다. 이것들은 별개의 것입니다. 나는 bytearray에 익숙하지 않지만'struct.unpack()'은'bytearray'에 의해 반환 된 객체를 취하지 않을 것이라고 확신한다. – monkut
@monkut : [버퍼 프로토콜] (http : //docs.python.org/3.3/c-api/buffer.html). – icktoofay
@icktoofay 감사합니다! 알아 둘만한! – monkut