Files
2026-10-16 21:11:50 +03:00

38 lines
1.1 KiB
Go

package usr
import (
"bytes"
"compress/zlib"
"fmt"
)
func Encode(xmlData []byte, maxXMLBytes int64) ([]byte, error) {
if len(xmlData) == 0 {
return nil, fmt.Errorf("пустой XML")
}
if maxXMLBytes <= 0 || int64(len(xmlData)) > maxXMLBytes {
return nil, fmt.Errorf("XML превышает допустимый размер (%d байт)", maxXMLBytes)
}
var buf bytes.Buffer
writer, err := zlib.NewWriterLevel(&buf, 6)
if err != nil {
return nil, fmt.Errorf("создание zlib: %w", err)
}
if _, err := writer.Write(xmlData); err != nil {
return nil, fmt.Errorf("сжатие XML: %w", err)
}
if err := writer.Close(); err != nil {
return nil, fmt.Errorf("завершение сжатия XML: %w", err)
}
if int64(buf.Len()) > MaxInputBytes {
return nil, fmt.Errorf("размер сжатых данных превышает предел USR (%d байт)", MaxInputBytes)
}
encoded := append([]byte(nil), buf.Bytes()...)
offset := byte(0x21)
for i := range encoded {
encoded[i] += offset
offset += 0x32
}
return encoded, nil
}