====== Synchsafe Integers ======
Recently, I was looking at putting together a simple, easy to use, Python library for reading and writing ID3v2 tags in mp3 files. This is rather non-trivial as the ID3v2 headers are somewhat complicated. One of the things that I found rather mystifying at first is the use of [[wp>Synchsafe|Synchsafe Integers]]. The Wikipedia page linked to in the previous sentence actually has a simple algorithm in C to "unsynchsafe" an integer. Nowhere, that I could find, was the reverse algorithm so I decided to publish mine here. The example on Wikipedia is in C, but I've done both of the following examples in Python (you should be able to easily adapt this back to C, or any other lang. for that matter).
===== Unsynchsafe =====
The code:
def unsynchsafe(num):
out = 0
mask = 0x7f000000
for i in range(4):
out >>= 1
out |= num & mask
mask >>= 8
return out
===== Makesynchsafe =====
The code for the slightly more complicated ''makesynchsafe()'':
def makesynchsafe(num):
mask = 0x0000007f
ret = 0
for i in range(4):
t = num >> (i * 8)
t &= mask
t <<= (i * 8)
ret |= t
num <<= 1
return ret