C# 解析二进制Redis密钥

C# 解析二进制Redis密钥,c#,string,redis,C#,String,Redis,我给Redis写了一个16字节的二进制密钥。当我查询密钥时,它以以下格式返回: \xc9;\xfd5\x80\x00\xa9Z\xc9\x0fb\xef\x7f\xd6V] 这个字符串是什么格式的?看起来应该是十六进制(\x),但其中还有其他字符不是有效的十六进制字符 如何将此字符串转换回原始字节数组字节[](使用C#)?您似乎编写了一个字节数组字节[],但将其作为字符串读取。有些代码如0x35对应于有效的ASCII字符('5'),有些代码如0x00则不对应,因此表示为\x00,因此您有一个奇

我给Redis写了一个16字节的二进制密钥。当我查询密钥时,它以以下格式返回:

\xc9;\xfd5\x80\x00\xa9Z\xc9\x0fb\xef\x7f\xd6V]
这个
字符串是什么格式的?看起来应该是十六进制(
\x
),但其中还有其他字符不是有效的十六进制字符


如何将此
字符串
转换回原始字节数组
字节[]
(使用C#)?

您似乎编写了一个字节数组
字节[]
,但将其作为
字符串
读取。有些代码如
0x35
对应于有效的ASCII字符(
'5'
),有些代码如
0x00
则不对应,因此表示为
\x00
,因此您有一个奇怪的字符串

让我们尝试将合成的字符串解析回原始的
字节[]

首先,让我们摆脱
\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());
其次,假设所有字符都是ASCII,我们从字符串中获取
字节[]

  byte[] array = result
    .Select(c => (byte)c)
    .ToArray();
让我们看看
数组

  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

您如何查询密钥?钥匙命令?你会以不同的格式取回它,这似乎很奇怪。发布设置和查询密钥的代码是初始数组
[c9、3b、fd、35、80、00、a9、5a、c9、0f、62、ef、7f、d6、56、5d]
(十进制:
[201、59、253、53、128、0、169、90、201、15、98、239、127、214、86、93]
)?@ste-fu-是的,它是用StackExchange.Redis以
字节[]
并使用KEYS命令读回,因此它以不同(可打印)格式返回。