ID3 태그 파싱중에 생긴 궁금증....

|
AlbumTag프로그램을 짜면서,
외부 ID3태그 라이브러리를 가져다 쓰려다가 직접 파싱해보기로 하고
파싱 작업을 하는데....

자꾸 군데군데서 에러가 나는거다..

바로 ID3 Frame Header에서 실제 크기와 표시된 크기가 맞지 않는 문제였는데...

주로 APIC(앨범아트), USLT, LYRC(가사 관련인듯), PRIV 등 길이가 대체로 긴 프레임들에서 에러가 나는거다.

처음엔 프레임 ID로 구분해서 synchsafe로 기록을 할지 unsigned int 그대로 기록(읽기)을 할지 코딩을 했는데
암만 생각해도 이상한거다...

스펙 문서상에 관련된 언급도 없고,
구글을 아무리 뒤져봐도 특정 태그에서 특정 파싱 방법을 찾을수도 없더랬다.


synchsafe방식은 32비트=4바이트의 각 바이트 첫 비트를 0으로 정해놓고 쓰는 방법인데,
ID3헤더 자체 크기는 synchsafe로 정상적으로 읽히는데, 프레임 헤더쪽이 문제가 생겼더랬다.


일단, 길이가 긴 프레임들에서 문제가 생기는것으로 봐서
다른 필드를 synchsafe적용 전과 후가 값이 같은 0x80보다 임의적으로 크게 해서 테스트를 해봤다.



사용자 삽입 이미지



0x54 49 54 32 가 ascii로 하면 TIT2, 즉 곡명을 나타내는 프레임이고,
뒤에 따르는 4바이트가 프레임의 크기를 나타내는 바이트이다.

크기 값은 0x00 00 02 E7 로,
synchsafe를 적용하면 359바이트, (애초에 마지막 바이트인 E7의 첫 비트가 1이므로 synchsafe의 규칙에 어긋나지만 어쨌든...)
적용하지 않으면 743바이트이다.

실제 데이터의 크기를 비교해보면,
테이터가 시작되는 부분은 프레임 플래그가 끝나는 0x0014, 그리고 마지막은 0x02FA

실제 데이터의 길이는 synchsafe를 적용하지 않은 값인걸 알 수 있다...

왜 이런거지....


스펙 문서엔 다음과 같이 되어 있다.
사용자 삽입 이미지

http://www.id3.org/id3v2.4.0-structure


"stored as a 32 bit synchsafe integer."

내가 해석을 잘못한건가...?


어렵네.....




-----------------------------
2011. 8. 16일 추가.
2.4인 경우에는 헤더와 프레임헤더에 모두 synchsafe방식,
2.3인 경우엔 헤더엔 synchsafe, 프레임헤더엔 4 byte-integer 방식.

'Knowledge > 기타' 카테고리의 다른 글

OAuth가 무어냐?  (0) 2010.11.17
EXIF 포맷의 구조  (2) 2010.11.12
듀얼모니터에서 따로 월페이퍼 적용하기  (1) 2009.03.10
우분투 하드 교체하기  (2) 2009.02.17
그리스몽키(greasemonkey) 설치 및 사용하기  (0) 2008.12.12
And