문제
비슷하다 이것 질문, ID3V2 태그 헤더에서 읽으려고 노력하고 있으며 파이썬에서 개별 바이트를 얻는 방법을 알아내는 데 어려움이 있습니다.
먼저 10 바이트를 모두 문자열로 읽었습니다. 그런 다음 개별 정보를 구문 분석하고 싶습니다.
문자열에서 두 버전 번호 숯을 잡을 수는 있지만 그 두 숯을 가져 가서 정수를 꺼내는 방법을 모르겠습니다.
구조물 패키지는 내가 원하는 것 같지만 작동하지는 않습니다.
여기 내 코드가 소위 코드입니다 (Python BTW를 처음 접했습니다 ... 쉽게 가져 가십시오) :
def __init__(self, ten_byte_string):
self.whole_string = ten_byte_string
self.file_identifier = self.whole_string[:3]
self.major_version = struct.pack('x', self.whole_string[3:4]) #this
self.minor_version = struct.pack('x', self.whole_string[4:5]) # and this
self.flags = self.whole_string[5:6]
self.len = self.whole_string[6:10]
제외한 값을 인쇄하는 것은 제대로 형식화되지 않기 때문에 분명히 쓰레기입니다.
해결책
16 비트 정수로 해석하려는 2 바이트가있는 문자열이있는 경우 다음을 수행 할 수 있습니다.
>>> s = '\0\x02'
>>> struct.unpack('>H', s)
(2,)
>은 빅 엔디 안을위한 것입니다 (정수의 가장 큰 부분이 먼저 온다). 이것은 ID3 태그 사용 형식입니다.
다른 크기의 정수의 경우 다른 형식 코드를 사용합니다. 예를 들어. 서명 된 32 비트 정수의 "나는". 자세한 내용은 도움말 (struct)을 참조하십시오.
한 번에 여러 요소를 포장 할 수도 있습니다. 예를 들어 서명되지 않은 2 개의 반바지에 이어 서명 된 32 비트 값이 뒤 따릅니다.
>>> a,b,c = struct.unpack('>HHi', some_string)
코드를 따라 가면 (순서대로) 찾고 있습니다.
- 3 문자열
- 2 개의 단일 바이트 값 (메이저 및 마이너 버전)
- 1 바이트 플래그 변수
- 32 비트 길이 수량
이것의 형식은 다음과 같습니다.
ident, major, minor, flags, len = struct.unpack('>3sBBBI', ten_byte_string)
다른 팁
ID3V2 태그 헤더를 읽으려고합니다.
fwiw, 거기 있습니다 이미 모듈입니다 이것을 위해.
나는 그것을 추천하려고했다 struct
패키지 그러나 당신은 그것을 시도했다고 말했습니다. 이 시도:
self.major_version = struct.unpack('H', self.whole_string[3:5])
그만큼 pack()
함수는 파이썬 데이터 유형을 비트로 대화하고 unpack()
기능은 비트를 파이썬 데이터 유형으로 변환합니다.