Reading an ID3v2.3+ tag it is versy useful, because these tag's frames might be compressed. Zlib compressed frame layout (ID3v2.3):
Descriptior Size
-------------------
Frameheader:
Frame id: 4 bytes
Frame size (full frame size - frameheader size): 4 bytes
Frame flags: 2 bytes
The 2nd byte's 7th bit must be 1 (e.g.: %1xy00000)
Frame content decrompessed size: 4 bytes
--------------------
Framecontent:
Compressed string described in 'frame size'
<?php
$frame="[read from a mp3 file]";
$frame_id=substr($frame,0,4);
$cs=substr($frame,10,4);
$checksize=$cs[3]*16777216+$cs[2]*65536+$cs[1]*256+$cs[0];
$content=substr($frame,14,$contentsize);
$content=gzuncompress($content);
if(strlen($content)!=$checksize){
echo 'Error whil uncrompessing frame data<br>';
}
echo $content;
?>