Мне нужно сохранить записанный сжатый текст в 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();
}
}
}
}