Разбор двоичного ключа Redis - PullRequest
1 голос
/ 18 июня 2019

Я написал 16-байтовый двоичный ключ для Redis. Когда я запрашиваю ключ, он возвращается в следующем формате:

\xc9;\xfd5\x80\x00\xa9Z\xc9\x0fb\xef\x7f\xd6V]

Какой это формат string? Похоже, он должен быть шестнадцатеричным (\x), но есть и другие символы, которые не являются допустимыми шестнадцатеричными символами.

Как мне преобразовать этот string обратно в мой оригинальный байтовый массив byte[] (с использованием C #)?

1 Ответ

2 голосов
/ 18 июня 2019

Кажется, что вы пишете байтовый массив byte[], но читаете его как string. Некоторые коды, такие как 0x35, соответствуют действительным символам ASCII ('5'), некоторые коды, такие как 0x00, не являются и, таким образом, представлены как \x00, поэтому у вас странная строка.

Попробуем разобрать составленную строку обратно в исходную byte[].

Во-первых, давайте избавимся от формата \x.. и получим допустимую строку с помощью регулярных выражений:

  using System.Text.RegularExpressions;

  ...

  string source = @"\xc9;\xfd5\x80\x00\xa9Z\xc9\x0fb\xef\x7f\xd6V]";

  string result = Regex.Replace(
    source,
   @"\\x[0-9A-Fa-f]{2}",
    m => ((char)Convert.ToInt32(m.Value.Substring(2), 16)).ToString());

Во-вторых, давайте получим byte[] из строки, предполагая, что все символы ASCII:

  byte[] array = result
    .Select(c => (byte)c)
    .ToArray();

Давайте посмотрим на array:

  Console.Write(string.Join(", ", array.Select(x => $"{x:x2}")));

Итог:

  c9, 3b, fd, 35, 80, 00, a9, 5a, c9, 0f, 62, ef, 7f, d6, 56, 5d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...