Member 1097736 Ответов: 1

Как преобразовать ответ byte[] в список, Словарь или объект?


Я получаю ответ для мастеров командного дозора против сервера redis.

public string GetMasterFromSentinel(string sentinelAddress)
        {
            TcpClient server;

            try
            {
                var splittedAddress = sentinelAddress.Split(':');
                server = new TcpClient(splittedAddress[0], int.Parse(splittedAddress[1]));
            }
            catch (SocketException)
            {
                // _log.Error("Unable to connect to server");
                return string.Empty;
            }
            NetworkStream ns = server.GetStream();
            var payload = new byte[] { 0x2a, 0x32, 0x0d, 0x0a, 0x24, 0x38, 0x0d, 0x0a, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6c, 
                0x0d, 0x0a, 0x24, 0x37, 0x0d, 0x0a, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x0d, 0x0a };
            ns.Write(payload, 0, payload.Length);
            ns.Flush();

            var data = new byte[1024];
            ns.Read(data, 0, data.Length);

            ns.Close();
            server.Close();
            string output = string.Empty;
           
            foreach (byte b in data)
                output += (Char)b;
           
           //i have put remove nulls from the string
            output = output.Replace("\r\n", string.Empty).Replace("$","|");

            return output;
        }


Значение вывода до удаления нулей: "* 1 \ r \ n * 40 \ r \ n $ 4 \ r \ nname \ r \ n $ 8 \ r \ nmymaster \ r \ n $ 2 \ r \ nip \ r \ n $ 12 \ r \ n10.93.247.96 \ r \ n $ 4 \ r \ nport \ r \ n $ 4 \ r \ n6379 \ r \ n $ 5 \ r \ nrunid \ r \ n $ 40 \ r \ n03ba9934d84efe28e583f4dca03f5b6c710bd712 \ r \ n $ 5 \ r \ nflags \ r \ n $ 6 \ r \ nmaster \ r \ n $ 21 \ r \ nкоманды ожидания ссылки \ r \ n $ 1 \ r \ n0 \ r \ n $ 13 \ r \ nссчет ссылок \ r \ n $ 1 \ r \ n1 \ r \ n $ 14 \ r \ nпоследний-отправленный \ r \ n $ 1 \ r \ n0 \ r \ n $ 18 \ r \ nпоследний-ок-пинг-ответ \ r \ n $ 3 \ r \ n134 \ r \ n $ 15 \ r \ nпоследний-ответ-пинг \ r \ n $ 3 \ r \ n134 \ r \ n $ 23 \ r \ ndown-after-milliseconds \ r \ n $ 5 \ r \ n10000 \ r \ n $ 12 \ r \ ninfo-refresh \ r \ n $ 4 \ r \ n6802 \ r \ n $ 13 \ r \ nРоль-отчет \ r \ n $ 6 \ r \ nmaster \ r \ n $ 18 \ r \ n-время-отчет \ r \ n $ 8 \ r \ n76627249 \ r \ n $ 12 \ r \ nconfig-epoch \ r \ n $ 1 \ r \ n6 \ r \ n $ 10 \ r \ nnum-slaves \ r \ n $ 1 \ r \ n1 \ r \ n $ 19 \ r \ nnum-other-sentinels \ r \ n $ 1 \ r \ n1 \ r \ n $ 6 \ r \ nquorum \ r \ n $ 1 \ r \ n2 \ r \ n $ 16 \ r \ n Тайм-аут аварийного переключения \ r \ n $ 6 \ r \ n180000 \ r \ n $ 14 \ r \ nпараллельная синхронизация \ r \ n $ 1 \ r \ n1 \ r \ n \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 "

Значение вывода после удаления нулей:
"* 1 * 40 $ 4name $ 8mymaster $ 2ip $ 1210.73.247.36 $ 4port $ 46379 $ 5runid $ 4003ba9934d84efe28e583f4dca03f5b6c710bd712 $ 5flags $ 6master $ 21link-pending-commands $ 10 $ 13link-refcount-$ 11 $ $ 10 $ 13link-refcount-$ 11 $ -reply $ 3958 $ 15last-ping-reply $ 3958 $ 23down-after-milliseconds $ 510000 $ 12info-refresh $ 48689 $ 13 роль-сообщила $ 6master $ 18 роль-сообщение-время $ 876879953 $ 12config-epoch $ 16 $ 10num-slaves $ 11 $ 19num-other- часовые $ 11 $ 6quorum $ 12 $ 16 таймаут отработки отказа $ 6180000 $ 14 параллельная синхронизация $ 11 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 "


Мне нужно преобразовать соответствующий ключ и значения в словарь или объект.

Что я уже пробовал:

Я попытался удалить нули из вывода.
Есть ли правильный способ фильтровать/анализировать информацию, отправленную сервером redis?
Фактический ответ от Redis будет таким:
1) 1) " имя"
2) "спасение"
3) " ip"
4) "127.0.0.1"
5) " порт"
6) "7789"
...

Richard MacCutchan

"Есть ли правильный способ фильтровать / анализировать информацию"
Да, проверьте документацию, чтобы узнать точную структуру возвращаемой информации.

Member 1097736

Я обновил его. Можете проверить?

Richard MacCutchan

Нет, потому что у меня нет документов.

1 Ответов

Рейтинг:
9

Kornfeld Eliyahu Peter

Насколько мне известно, эти части редиста не задокументированы...
Однако вот как вы можете его разобрать...

Сначала обратите внимание, что данные разделены классическим c carriage-return+newline (\r\n)... Поэтому вы должны интерпретировать его строчку за строчкой...
Строки, начинающиеся с * (звездочка), являются счетчиками...
Таким образом, первая строка (*1) означает, что у вас есть 1 блок (один мастер)
Вторая строка (*40) означает, что существует 40 значений... но так как каждому значению предшествует его длина, то на самом деле у вас есть 80 строк...
Теперь линии с $ (долларом) являются индикатором длины линий после них...
Например, "$4 " и "name" - это две соединенные строки (4-это длина строки "name")
Если вы разобьете его, то получите вот это:

*1
*40
$4
name
$8
mymaster
$2
ip
$12
10.93.247.96
$4
port
$4
6379
$5
runid
$40
03ba9934d84efe28e583f4dca03f5b6c710bd712
$5
flags
$6
master
$21
link-pending-commands
$1
0
$13
link-refcount
$1
1
$14
last-ping-sent
$1
0
$18
last-ok-ping-reply
$3
134
$15
last-ping-reply
$3
134
$23
down-after-milliseconds
$5
10000
$12
info-refresh
$4
6802
$13
role-reported
$6
master
$18
role-reported-time
$8
76627249
$12
config-epoch
$1
6
$10
num-slaves
$1
1
$19
num-other-sentinels
$1
1
$6
quorum
$1
2
$16
failover-timeout
$6
180000
$14
parallel-syncs
$1
1

А если вы его уберете:
name					=	mymaster
ip						=	10.93.247.96
port					=	6379
runid					=	03ba9934d84efe28e583f4dca03f5b6c710bd712
flags					=	master
link-pending-commands	=	0
link-refcount			=	1
last-ping-sent			=	0
last-ok-ping-reply		=	134
last-ping-reply			=	134
down-after-milliseconds	=	10000
info-refresh			=	6802
role-reported			=	master
role-reported-time		=	76627249
config-epoch			=	6
num-slaves				=	1
num-other-sentinels		=	1
quorum					=	2
failover-timeout		=	180000
parallel-syncs			=	1