【问题标题】:String Comparison Length Mismatch字符串比较长度不匹配
【发布时间】:2016-08-26 02:28:14
【问题描述】:

我正在比较两个字符串,一个是我从服务器收到的包含 32 个字符的字符串,另一个是我使用以下代码计算的:

string getMd5(string fileName)
{
    using (var md5 = MD5.Create())
    {
        using (var stream = File.OpenRead(fileName))
        {
            return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "‌​").ToLower();
        }
    }
}

问题是,即使两个字符串看起来相同,比较也会失败,因为上面函数返回的字符串包含的字符比我收到的要多。请看附图:

那么,我该如何解决呢?

谢谢。

【问题讨论】:

  • 它看起来不像包含更多字符。你怎么知道的?
  • @FirstStep 你能看到currentMd5.Length吗?这怎么可能?您看到并数了 32 个字符,但长度显示有 62 个,因此比较失败。
  • @FirstStep,请参阅随附的手表图片中的 Length
  • 为什么要将输出转换为字符串而不是直接比较byte[]
  • @FirstStep 假设不同的字符在末尾,而不是在开头或中间。

标签: c# string md5


【解决方案1】:

这是因为您的代码中的 "‌​" 实际上包含两个不可见的 Unicode 字符 - 'ZERO WIDTH NON-JOINER' (U+200C)'ZERO WIDTH SPACE' (U+200B)。我的猜测是他们到达那里是因为在某些时候源代码片段通过了 Word 之类的文字处理器。使用string.Empty 或免费使用""

【讨论】:

  • 那么为什么所有这些都返回0 的长度? ("" + "").Length, "ab".Replace("a", "").Replace("b", "").Length, "ab".Replace("a", "").Replace("b", "").ToLower().Length
  • @Quantic - 那是因为“你的”空字符串实际上是空字符串。将它们复制到记事本并将它们保存为 Unicode(在 MS 术语中实际上是 UTF-16LE) - 文件大小将是双引号的数量乘以 2。然后从问题中复制表面上为空的字符串并保存文件 - 您会看到该文件实际上是 8 个字节 - 4 个用于两个引号,4 个用于两个不可见字符。让我挖掘一下这些角色实际上是什么......
  • @Quantic 使用 似乎 像有问题的空字符串的“‌​”。 (或试试这个代码var xx = "‌​".Length;)
  • 好吧,当我复制 OP 的 "" 时,你是对的,它里面有 2 个不可见的字符。对于@EdPlunkett,这是怎么发生的? OP 是否从某处复制并粘贴了 "",而不是直接从他的键盘将其输入到编辑器中?
  • @EdPlunkett var bytes = BitConverter.ToString(Encoding.UTF8.GetBytes("‌​")); utf8-chartable.de/…
猜你喜欢
  • 2013-02-12
  • 2022-03-30
  • 2021-11-23
  • 2016-02-04
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 2018-07-24
相关资源
最近更新 更多