как сжать в ASCII читаемый текст? - PullRequest
0 голосов
/ 22 марта 2019

Мне нужно сохранить записанный сжатый текст в QR-код, а затем отсканировать и распаковать его.

Исходный текст - это минимизированные строки JSON: {"ref":"WR0001","customsType":"GIFT","insuredValue":20000,"weight":500,"shippingMethod":"EMS","sender":{"notificationEmail":"asd@asd.com","phoneNumber":"+818023459877","address":{"name":"TestName","companyName":"TestCompanyName","address1":"Testaddress1","address2":"Testaddress2","city":"Testcity","postalCode":"111222","region":"Tokyo","countryIso2":"ES"}},"recipient":{"phoneNumber":"+81231231","address":{"name":"John","companyName":"Salchichon","address1":"myhome","address2":"somewhere","city":"somecity","region":"someregion","postalCode":"111","codiceFiscale":"232323","countryIso2":"IT"}},"items":[{"quantity":1,"price":1000,"customs":"Somecustoms1"},{"quantity":2,"price":1500,"customs":"Somecustoms2"}]}

Кажется, что Deflate генерирует двоичный текст, подобный этому

- MM, I, ÉÌÏSÈÈ / QHÎÈLÎNÍS (K,È / * O, JŠ ”% gèf§Vò [... усечено]

Существует ли алгоритм сжатия, который будет отображать текст base64? Мне нужно что-то, что я могу сохранить в QR-коде.

Если я просто применяю кодировку base64 к сжатым байтам, я получаю строку, которая больше моего исходного текста!

public partial class Main : Form
{
    public Main()
    {
        InitializeComponent();
        this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.Main_KeyPress);
    }
    List<char> _barcode = new List<char>(1000);
private void Main_KeyPress(object sender, KeyPressEventArgs e)
    {

        _barcode.Add(e.KeyChar);

        // process barcode
        if (e.KeyChar == 13 && _barcode.Count > 0)
        {
            string msg = new String(_barcode.ToArray());
            MessageBox.Show(msg );
            Console.WriteLine(msg);

            //serializer
            MemoryStream stream = new MemoryStream(Encoding.Default.GetBytes(msg));

            byte[] compressedBytes;
            compressedBytes = Compress(stream);
            Console.WriteLine("compressed:" + Encoding.Default.GetString(compressedBytes));

            Decompress(compressedBytes);

            _barcode.Clear();


        }
    }

    private static Stream Decompress(byte[] input)
    {
        var output = new MemoryStream();

        using (var compressStream = new MemoryStream(input))
        using (var decompressor = new DeflateStream(compressStream, CompressionMode.Decompress))
            decompressor.CopyTo(output);

        output.Position = 0;
        Console.WriteLine("decompressed:" + Encoding.Default.GetString(output.ToArray()));
        output.Position = 0;
        return output;
    }


    private static byte[] Compress(Stream input)
    {
        using (var compressStream = new MemoryStream())
        using (var compressor = new DeflateStream(compressStream, CompressionMode.Compress))
        {
            input.CopyTo(compressor);
            compressor.Close();
            return compressStream.ToArray();
        }
    }
}

}

1 Ответ

1 голос
/ 23 марта 2019

Если ваши данные сжимают 4: 1, как вы упомянули в комментарии, то кодирование с Base64 только увеличит его на 33%, оставив вас со сжатием 3: 1.

Вместо этого вы можете использовать кодировку Base85,выбрав 85 печатных символов.Это преобразует четыре байта в пять символов вместо трех байтов в четыре символа, как это делает Base64.

...