2012-05-06 3 views
2

은 내가 몇 가지 도움이 필요하다는 것을 여기에 작은 스크립트가 있습니다. 테스트 용으로 저는 49 곡을 포함하는 곡을 쓰고 있습니다 - 노래는 49 곡을 반복하여 반복하는 목록입니다문제 해결 binascii 홀수 길이 문자열 문제

저는 songbyte를 써야합니다. 이것은 8에서 72 사이의 값입니다. 지금 나는 단지 iterating을 통해 각 songbyte에 대한 올바른 값을 가지고 있는지 확인하고있다. (알려진 올바른 재생 목록의 사본이며, diff와 16 진수 편집기를 통해 확인하고있다.)

내 문제는 라인

print(binascii.a2b_hex("{0:x}".format(songbyte))) 

은 "홀수 길이 문자열 형식 오류를"발생한다는 것입니다. 자, 이것은 충분히 설명력이 있습니다. 조사를 통해 나는 songbyte의 값이 에러가 될 때의 가치가 8이라고 결정했다. 그러나이 에러는 37 개의 노래가 목록에 나오고 다른 노래의 songbytes 또한 8입니다 - 내 len (str (songbyte)) < 2 체크를 붙잡 으면 0이 붙지 만, 이상하게도이 것은 없습니다.

비록 내가 생각할 수는 없지만 이것이 전체 스크립트의 전체 세부 사항을 제공하지 못하면서 문제를 해결할 수있는 충분한 정보인지는 모르겠습니다. songbyte (16 진수)를 파일에 쓸 수있는 또 다른 방법이 있습니까?

답변

1

당신은 바로이 목적을 위해 의미 struct.pack를 사용해야합니다

import struct 
for song in songs: 
    slash = song.rindex('\\') 
    songbyte = slash + 2 
    f.write(struct.pack('!B', songbyte)) 

문자열 "{0:x}"는 번호 앞에 제로를 삽입하지 않습니다 형식은, 당신이 "{0:02x}"를 원하는 것입니다.

>>> "{0:x}".format(12) 
'c' 
>>> "{0:02x}".format(12) 
'0c' 

그럼에도 불구하고, binascii를 사용하는 것은 불필요하게 복잡하고 부서지기 쉬운 코드에 연결됩니다. 예를 들어, 값이 255를 초과하면 자동으로 2 자 이상을 생성합니다.

+0

와우는 매우 훌륭하게 작동했습니다. 구조체를 확실히 읽어야합니다! 고맙습니다. – src