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 }