我正在C#winforms应用程序中使用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;
}
我想我通过尝试转换为二进制代码而不是仅转换为字节数组增加了复杂性,但是我还没有碰到能够附加到我的问题的代码。 – JYelton 2010-08-11 22:09:48
我已经更新了这个问题 - 我认为这与二进制转换一起工作,因为它以某种方式确保所有压缩字节都是ascii可打印的字符。如果我简单地将字符串转换为字节数组然后进行压缩,结果字节在可打印字符之外,因此我无法解码它。 – JYelton 2010-08-11 22:22:08
@JYelton:在这种情况下,有一个更简单的答案。编辑... – 2010-08-11 22:25:46