문제

비슷하다 이것 질문, 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)

다른 팁

왜 직접 쓰나요? (이 다른 옵션을 확인하지 않았다고 가정합니다.) Python의 MP3에서 ID3 태그 정보를 읽을 수있는 몇 가지 옵션이 있습니다. 내 확인 대답 위에 이것 의문.

ID3V2 태그 헤더를 읽으려고합니다.

fwiw, 거기 있습니다 이미 모듈입니다 이것을 위해.

나는 그것을 추천하려고했다 struct 패키지 그러나 당신은 그것을 시도했다고 말했습니다. 이 시도:

self.major_version = struct.unpack('H', self.whole_string[3:5])

그만큼 pack() 함수는 파이썬 데이터 유형을 비트로 대화하고 unpack() 기능은 비트를 파이썬 데이터 유형으로 변환합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top