*исправления по считыванию данных без BOM
*добавлены работающие тесты
This commit is contained in:
1 parent
d03f6214aa
commit
aa04fd4df0
11 files changed
+191
-55
No files matched your search
+12
-3
@@ -54,10 +54,19 @@ fn (mut frame Frame) fill(bytes []u8, start_position u64, idv3_version u8) {
|
||||
// Фрейм целиком вместе с заголовком, чтобы записать его обратно без изменений
|
||||
frame.apic = bytes[frame.start..frame.end]
|
||||
} else {
|
||||
// Выбор шага в записимости от версии ID3
|
||||
stride := if idv3_version == 3 { 13 } else { 11 }
|
||||
// Данные начинаются после 10 байт заголовка и байта кодировки
|
||||
mut data_start := frame.start + 11
|
||||
|
||||
// UTF-16 с BOM (01): 2 байта маркера, по ним определяется порядок байт
|
||||
if frame.encoding_name_idx == 1 && data_start + 2 <= frame.end {
|
||||
if bytes[data_start] == 0xFE && bytes[data_start + 1] == 0xFF {
|
||||
frame.encoding_name = "UTF-16BE"
|
||||
}
|
||||
data_start += 2
|
||||
}
|
||||
|
||||
// Замыкающие нули не относятся к данным
|
||||
frame.data = (iconv.encoding_to_vstring(bytes[frame.start+u64(stride)..frame.end], frame.encoding_name) or { "" }).trim_right('\x00')
|
||||
frame.data = (iconv.encoding_to_vstring(bytes[data_start..frame.end], frame.encoding_name) or { "" }).trim_right('\x00')
|
||||
|
||||
frame.addition = bytes[frame.start..frame.start + 10]
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user