Преобразовать шестнадцатеричное представление внутри строки в двоичный эквивалент - PullRequest
1 голос
/ 26 октября 2010

В строке замените каждое вхождение <0xYZ> символом шестнадцатеричного значения YZ. Символы <и> будут использоваться только для этой цели, строка гарантированно будет хорошо отформатирована.

Пример ('0' = 0x30): A<0x30>B => A0B

Это простая задача, но есть много решений, и мне было интересно, как лучше это сделать.

Ответы [ 3 ]

2 голосов
/ 26 октября 2010

Я думаю, что заменить регулярное выражение проще всего:

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

При сопоставлении с точным шаблоном это накладывает меньше ограничений на строку, например, символы < и > могутвсе еще будет использоваться.Кроме того, если тег окажется неправильным, он просто останется неизменным, а не вызовет исключение.

Это заменит такие теги, как <0X4A> и <0x4a>, но, например, <0x04a> останется неизменным..

1 голос
/ 26 октября 2010

Вы можете легко сделать это с помощью регулярного выражения:

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

Возможно, отсутствует несколько проверок ошибок.При этом используется перегрузка Regex.Replace, которая принимает MatchEvaluator.

0 голосов
/ 26 октября 2010

Совпадение числа и преобразование в 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
...