Synchsafe

From Wikipedia, the free encyclopedia
Jump to navigation Jump to search

Synchsafe integers appear in ID3 tags that are attached to an MP3 file.

An ID3 tag[1] encodes several blocks of data. Some blocks (containing metadata about the content of the file) are variable in length and are encoded as 'synchsafe' integers to distinguish them from data in other blocks.

In a synchsafe integer, the most significant bit of each byte is zero, making seven bits out of eight available. So, for example, a 32-bit synchsafe integer can only store 28 bits of information.

Examples:

(%11111111) is encoded as a 16-bit synchsafe integer (%00000001 01111111).
(%11111111 11111111) is encoded as a 24-bit synchsafe integer (%00000011 01111111 01111111).

The ID3 specifications require that multibyte numbers such as these be stored in big-endian order,[1] so the bytes will be ordered exactly as laid out in the examples above.

C/C++ code to decode Synchsafe encoded values[edit]

int synchsafe(int in)
{
	int out, mask = 0x7F;

	while (mask ^ 0x7FFFFFFF) {
		out = in & ~mask;
		out <<= 1;
		out |= in & mask;
		mask = ((mask + 1) << 8) - 1;
		in = out;
	}

	return out;
}

int unsynchsafe(int in)
{
	int out = 0, mask = 0x7F000000;

	while (mask) {
		out >>= 1;
		out |= in & mask;
		mask >>= 8;
	}

	return out;
}

x86 assembler (masm) code to decode Synchsafe encoded values[edit]

Synchsafe2int	proc	stdcall,value
	push   edx
	mov    eax,value
	xor    edx,edx
	bswap  eax
	shl    eax,1
	shld   edx,eax,7
	shl    eax,8
	shld   edx,eax,7
	shl    eax,8
	shld   edx,eax,7
	shl    eax,8
	shld   edx,eax,7
	mov    eax,edx
	pop    edx
	ret
	endp

References[edit]