我正在使用C#winforms app中的GZipStream
类实现行程编码。
数据由一系列由换行符分隔的字符串提供,如下所示:
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;
}
答案 0 :(得分:2)
首先:你确定只压缩文本与压缩“转换为二进制”形式没有太大相同的结果吗?
假设您想继续转换为二进制文件,我可以建议两个选项:
GZipStream
获得什么,都不是文字,不应将其视为使用Encoding
的文字。但是,您可以通过调用Convert.ToBase64String
轻松地将其转换为 ASCII文本。顺便说一句,你错过的另一个技巧就是在ToArray
上拨打MemoryStream
,这样就可以将内容作为byte[]
给你,而且没有额外的麻烦。
答案 1 :(得分:0)
如果您发布的数据代表所有数据,那么每4个字节就有一个换行符,因此如果您在转换回来时需要它,只需在每4个字节的数据中加一个