gpt4 book ai didi

c# - 一种使用独特压缩形式解压缩文本文件的更快方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:27:56 25 4
gpt4 key购买 nike

我不知道这种类型的压缩是否在其他地方使用,但这就是它的工作原理。它使用 4 个字符。第一个字符“ú”表示紧随其后的是压缩。接下来的 2 个字符以十六进制表示第 4 个位置要重复多少个。例如:

22ú05hú0C0AFC001

会是:

22hhhhh000000000000AFC001

我能够做到这一点,但它运行得非常慢。一个 20k 的文件可能需要 5 分钟或更长时间。

这是我的代码:

public string doDecompression(string Content)
{
string pattern = @"ú...";
Regex rgx = new Regex(pattern);

foreach (Match match in rgx.Matches(Content))
{
// Gets the raw Hex code
string hex = match.ToString().Substring(1, 2);

// Converts Hex code to an Integer
int convertedHex = Int32.Parse(hex, NumberStyles.HexNumber);

// Gets the character to repeat
string character = match.ToString().Substring(3, 1);

// Converts the character to repeat into
// a "char" so I can use it in the line below
char repeatingChar = character[0];

// Creates a string out of the repeating characters
string result = new String(repeatingChar, convertedHex);

// This does the actual replacing of the text
Content = Content.Replace(match.ToString(), result);
}

return Content;
}

有没有更好的办法?

最佳答案

您在这里看到的是 RLE algorithm 的变体。 .

你真的不需要正则表达式来完成这项工作,更不用说使用不可变字符串进行昂贵的操作了。

尝试以下方法:

public static IEnumerable<char> Decompress(string compressed)
{
for(var i = 0; i < compressed.Length; )
{
var c = compressed[i++];
if(c == 'ú')
{
var count = int.Parse(compressed.Substring(i, 2), NumberStyles.HexNumber);
i += 2;

c = compressed[i++];

foreach(var character in Enumerable.Repeat(c, count))
yield return character;
}
else
{
yield return c;
}
}
}

关于c# - 一种使用独特压缩形式解压缩文本文件的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29758100/

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