【问题标题】:How to shrink a string and be able to find the original later如何缩小字符串并在以后找到原始字符串
【发布时间】:2013-06-10 13:42:31
【问题描述】:

我正在开发这个仍处于测试阶段的应用程序,因此我设置了一个日志系统。日志太长,无法在mailto url 中使用,所以我考虑缩小文本然后解密。 假设我有一个 50 行长的日志,这应该可以帮助我制作类似 zef16z1e6f8 的内容,然后有一个程序来使用它来找出所有 50 行日志。 我想指出,我不需要任何花哨的 TripleDES 加密或其他东西。

【问题讨论】:

  • 我见过的最好的文本压缩率是 90 - 95% 左右。您的示例有 11 个字符,因此您的未压缩数据将是 110 到 116 个字符左右。如果您的行只有 2 个字符长,这不是问题。说真的,发布您的邮件代码怎么样?人们经常通过电子邮件发送大文件。压缩不应该是必要的。欲了解更多信息,please click this text and read
  • 您介意在您的日志内容中写入一个 GUID,并将其用作您的日志的 id 吗?

标签: c# string winforms compression mailto


【解决方案1】:

首先我建议重新审视一下为什么不能只邮寄整个日志内容?除非您有大型日志(> 5MB),否则我建议您只邮寄日志。如果您仍想采取一些收缩策略,我会考虑两种。

如果您想要一个简单的参考字符串,可用于在稍后阶段查找您的日志数据,您可以将某种标识符与数据相关联(例如 Eugene 建议的 GUID)。这样做的好处是具有恒定的长度,而与日志大小无关。

或者,您可以只压缩日志,这会稍微缩小数据(如 Dan 所述,最多可压缩 90%)。然而,这具有可变长度的缺点,并且对于非常大的日志可能仍然超出您的大小限制。如果你走这条路,你可以做这样的事情(未经测试):

private string GetCompressedString()
{
    byte[] byteArray = Encoding.UTF8.GetBytes("Some long log string");
    using (var ms = new MemoryStream())
    {
        using (var gz = new GZipStream(ms, CompressionMode.Compress, true))
        {
            ms.Write(byteArray, 0, byteArray.Length);
        }

        ms.Position = 0;

        var compressedBytes = new byte[ms.Length];
        ms.Read(compressedBytes, 0, compressedBytes.Length);

        return Convert.ToBase64String(compressedBytes);
    }
}

【讨论】:

    猜你喜欢
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2021-06-11
    相关资源
    最近更新 更多