代码之家  ›  专栏  ›  技术社区  ›  mafu

将字符串中的十六进制表示转换为等效的二进制表示

  •  1
  • mafu  · 技术社区  · 15 年前

    在字符串中,将每次出现的<0xYZ>替换为十六进制值YZ的字符。<和>字符将仅用于此目的,保证字符串格式正确。

    A<0x30>B => A0B

    这是一个简单的任务,但有很多解决办法,我想知道最好的办法。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Guffa    15 年前

    我认为正则表达式替换是最简单的方法:

    s = Regex.Replace(
      s,
      @"<0[Xx]([\dA-Fa-f]{2})>",
      m => ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString()
    );
    

    通过匹配一个精确的模式,它对字符串的限制更少,例如 < > 仍然可以使用字符。另外,如果一个标签碰巧出现了错误,那么它将不被标记,而不是导致异常。

    这将替换如下标记 <0X4A> <0x4a> ,但例如离开 <0x04a>

        2
  •  1
  •   Kobi    15 年前

    使用正则表达式可以轻松完成此操作:

    s = Regex.Replace(s, "<0x([0-9a-f]+)>",
          m => Char.ConvertFromUtf32(
                          Int32.Parse(m.Groups[1].Value, NumberStyles.HexNumber))
          ); 
    

    它可能缺少一些错误检查。它使用 overload of Regex.Replace that takes a MatchEvaluator

        3
  •  0
  •   BrunoLM    15 年前

    匹配数字并转换为int,然后转换为char。

    var str = "A<0x30>B";
    
    var result = Regex.Replace(str, "<0x((\\d|[A-Z])+)>",
        delegate (Match m)
        {
            return ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString();
        }, RegexOptions.IgnoreCase);
    

    输出

    A0B