// id3_unsync.mbt
//
// ID3v2 的 Unsynchronisation(反同步)还原。
//
// 写入侧为了不让标签内出现伪同步信号(%11111111 111xxxxx),会在每个
// $FF 后插入 $00;同时所有 $FF $00 组合都会被写成 $FF $00 $00。
// 因此还原规则只有一条:**遇到 $FF $00 就删掉这个 $00**。
// 注意不要"删掉所有 $00"——$FF 后面跟非零字节时那个 $FF 是原始数据。
///|
/// 还原 unsynchronisation,返回新分配的字节。
///
/// 输入不含伪同步时返回值与输入等值(会拷贝一份,便于上层统一处理)。
pub fn unsynchronise(data : BytesView) -> Bytes {
let out = @buffer.Buffer()
let mut i = 0
while i < data.length() {
let b = data.at(i)
out.write_byte(b)
if b == b'\xFF' && i + 1 < data.length() && data.at(i + 1) == b'\x00' {
// 跳过插入的 $00
i += 2
} else {
i += 1
}
}
out.to_bytes()
}