38 lines
1.1 KiB
Go
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
|
|
}
|