gpt4 book ai didi

c# - 十六进制字符串的运行长度编码,包括换行符

转载 作者:太空宇宙 更新时间:2023-11-03 11:45:53 24 4
gpt4 key购买 nike

我在 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;
}

最佳答案

首先:您确定仅压缩文本不会产生与压缩“转换为二进制”形式相同的结果吗?

假设您想继续转换为二进制,我可以建议两个选项:

  • 在每行的开头写一个数字,说明该行有多少字节。然后当你解压缩时,你读取并转换那么多字节,然后写一个换行符。如果您知道每行的长度总是小于 256 个字节,您可以将其表示为单个字节。否则,您可能需要更大的固定大小,或一些可变大小编码(例如,“虽然设置了最高位,但它仍然是数字的一部分”)——后者很快就会变得毛茸茸。
  • 或者,通过将其表示为(比如)0xFF、0x00 来“转义”一个换行符。然后,您需要将真正的 0xFF 转义为(比如)0xFF 0xFF。当您读取数据时,如果您读取的是 0xFF,那么您将读取下一个字节以确定它代表的是换行符还是真正的 0xFF。

编辑:我认为您最初的方法存在根本性缺陷。无论您从 GZipStream 中得到什么,都不是文本,不应将其视为使用Encoding 的文本。但是,您可以通过调用 Convert.ToBase64String 非常轻松地将它转换为 ASCII 文本。顺便说一句,您错过的另一个技巧是在 MemoryStream 上调用 ToArray,这将为您提供 byte[] 的内容没有多余的麻烦。

关于c# - 十六进制字符串的运行长度编码,包括换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3463136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com