Я реализую кодирование длины серии с использованием класса GZipStream
в приложении winforms C #.
Данные предоставляются в виде последовательности строк, разделенных символами новой строки, например:
FFFFFFFF
FFFFFEFF
FDFFFFFF
00FFFFFF
Перед сжатием я преобразую строку в байтовый массив, но это не дает результатов, если присутствуют символы новой строки.
Каждая новая строка имеет значение, но я не уверен, как сохранить свою позицию в кодировке.
Вот код, который я использую для преобразования в байтовый массив:
private static byte[] HexStringToByteArray(string _hex)
{
_hex = _hex.Replace("\r\n", "");
if (_hex.Length % 2 != 0) throw new FormatException("Hex string length must be divisible by 2.");
int l = _hex.Length / 2;
byte[] b = new byte[l];
for (int i = 0; i < l; i++)
b[i] = Convert.ToByte(_hex.Substring(i * 2, 2), 16);
return b;
}
Convert.ToByte
выдает исключение FormatException, если символы новой строки не удаляются, с информацией: «Дополнительные непарсируемыесимволы находятся в конце строки. "Что меня не удивляет.
Как лучше всего убедиться, что символы новой строки могут быть правильно включены?
Примечание Я должен добавить, что сжатая версия этой строки сама должна быть строкой, которая может быть включена в документ XML.
Редактировать:
Я пытался просто преобразовать строкув байтовый массив без выполнения какого-либо двоичного преобразования на нем, но все еще возникают проблемы со сжатием.Вот соответствующие методы:
private static byte[] StringToByteArray(string _s)
{
Encoding enc = Encoding.ASCII;
return enc.GetBytes(_s);
}
public static byte[] Compress(byte[] buffer)
{
MemoryStream ms = new MemoryStream();
GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true);
zip.Write(buffer, 0, buffer.Length);
zip.Close();
ms.Position = 0;
byte[] compressed = new byte[ms.Length];
ms.Read(compressed, 0, compressed.Length);
byte[] gzBuffer = new byte[compressed.Length + 4];
Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
return gzBuffer;
}