First commit
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user