*добавлено получение закодированного тэга

This commit is contained in:
K1ndWha1e committed 2026-07-18 22:14:05 +03:00
1 parent 4196efa9a6
commit fdc72ae653
4 files changed
+57 -25

No files matched your search

+34 -10
View File
@@ -11,10 +11,12 @@ pub struct Frame {
encoding_name string
data string
name string
encoding_name_idx u8
addition []u8
encoded_data []u8
apic ?[]u8
encoded_size ?[]u8
encoded_data ?[]u8
encoded_size []u8
modified bool
}
// Во врейме первый байт указывает кодировку 0 - ISO-8859-1 (Latin-1), 1 - UTF-16LE
@@ -42,6 +44,8 @@ fn (mut frame Frame) fill_frame(bytes []u8, start_position u64, idv3_version u8)
else { "UTF-8" }
}
frame.encoding_name_idx = u8(bytes[frame.start+10])
if frame.name.to_lower() == "apic" {
// Дополнительные байты с информацией (MIME)
frame.addition = bytes[frame.start+10..frame.start+24]
@@ -64,23 +68,43 @@ pub fn (mut frame Frame) encode_size(idv3_version u8) {
[u64(21), u64(14), u64(7), u64(0x7F)]
}
mut encoded_size := []u8{len: 4, cap: 16}
encoded_size << u8((frame.size >> stride[0]) & stride[3])
encoded_size << u8((frame.size >> stride[1]) & stride[3])
encoded_size << u8((frame.size >> stride[2]) & stride[3])
encoded_size << u8(frame.size & stride[3])
mut encoded_size := []u8{len: 4}
encoded_size[0] = u8((frame.size >> stride[0]) & stride[3])
encoded_size[1] = u8((frame.size >> stride[1]) & stride[3])
encoded_size[2] = u8((frame.size >> stride[2]) & stride[3])
encoded_size[3] = u8(frame.size & stride[3])
frame.encoded_size = encoded_size
// fnums2 := [1, 10, 100].to_fixed_size()
}
// Кодируем кадр для дальнейшей записи
pub fn (mut frame Frame) encode_frame(idv3_version u8) {
encoded_data := iconv.vstring_to_encoding(frame.data, frame.encoding_name) or { [u8(0), u8(0), u8(0), u8(0)] }
frame.encoded_data = encoded_data
frame.size = u64(encoded_data.len)
//
frame.size = u64(encoded_data.len + 10)
frame.encode_size(idv3_version)
}
// Получить закодированый тэг
pub fn (mut frame Frame) get_encoded_frame_tag(idv3_version u8) []u8 {
frame.encode_frame(idv3_version)
// Название тэга
mut encoded_tag := frame.name.bytes()
// Флаги, оставляем пустыми
encoded_tag << []u8{len: 2}
// Идекс кодировщика текста
encoded_tag << frame.encoding_name_idx
// Четыре числа на закодированный размер
encoded_tag << frame.encoded_size
// Уже сами данные
encoded_tag << frame.encoded_data
// Запас нулей чтобы не пересчитывать весь фрейм при маленьком редактировании
encoded_tag << []u8{len: 10}
return encoded_tag
}