将字符串转换为字节数组然后再改回有时将不会返回相同的字符串:
RandomNumberGenerator gen = new RNGCryptoServiceProvider();
byte[] randomBytes = new byte[32];
gen.GetBytes(randomBytes);
在某些情况下(或unicode以外的任何一种编码方式):
randomBytes != Encoding.Unicode.GetBytes(Encoding.Unicode.GetString(randomBytes));
我想知道如何执行此方法并确定获得相同的结果。 预先感谢
答案 0 :(得分:2)
可能您不是在寻找文本编码,而是在寻找序列化格式。文本编码用于文本。您正在处理的字节是随机字节。
Base64(Convert.ToBase64String
)对您有用吗?
您还可以将字节塞成char(new string(myBytes.Select(b => (char)b).ToArray())
)。这将产生难以阅读的字符串,容易被其他系统破坏。可能不是正确的路径。
答案 1 :(得分:1)
任意字节数组不必对有效 Unicode字符串进行编码(有关详细信息,请参见https://en.wikipedia.org/wiki/UTF-16),例如
byte[] before = new byte[] { 0xA6, 0xDD };
byte[] after = Encoding.Unicode.GetBytes(Encoding.Unicode.GetString(before));
if (!before.SequenceEqual(after))
Console.Write(string.Join(Environment.NewLine,
$"before: {string.Join(" ", before.Select(b => b.ToString("x2")))}",
$"after: {string.Join(" ", after.Select(b => b.ToString("x2")))}"));
结果:
before: a6 dd
after: fd ff
如果要生成这些字符串,可以将代码修改为
while (true) {
using (RandomNumberGenerator gen = new RNGCryptoServiceProvider()) {
byte[] randomBytes = new byte[32];
gen.GetBytes(randomBytes);
byte[] after = Encoding.Unicode.GetBytes(Encoding.Unicode.GetString(randomBytes));
if (!randomBytes.SequenceEqual(after)) {
Console.Write(string.Join(" ", randomBytes) +
Environment.NewLine +
string.Join(" ", after));
break;
}
}
}
可能的结果:
166 8 99 175 188 233 240 219 64 143 26 87 157 209 205 219 27 169 239 67 99 170 172 226 254 56 168 168 64 222 178 15
166 8 99 175 188 233 253 255 64 143 26 87 157 209 253 255 27 169 239 67 99 170 172 226 254 56 168 168 253 255 178 15
^
Difference
请注意,我们应该将数组与SequenceEqual
进行比较。
如果要对数组进行编码,则可以借助string.Join
:
byte[] array = ...
// Something like "166 8 99 175 188 233 240 219 ... 64 222 178 15"
string encoded = string.Join(" ", array);
byte[] back = encoded
.Split(' ')
.Select(item => byte.Parse(item))
.ToArray();