C# 数组和字符串编码

C# 数组和字符串编码,c#,encoding,C#,Encoding,当我这样做的时候 string s = Encoding.Unicode.GetString(a); byte[] aa = Encoding.Unicode.GetBytes(s); 我有不同的数组(a!=aa)为什么 但当我这么做的时候?没关系 string s = Encoding.Default.GetString(a); byte[] aa = Encoding.Default.GetBytes(s); 这是因为您使用的是反向编码。编码用于将字符串编码为字节,然后再返回到字符串 在

当我这样做的时候

string s = Encoding.Unicode.GetString(a);
byte[] aa = Encoding.Unicode.GetBytes(s);
我有不同的数组(a!=aa)为什么

但当我这么做的时候?没关系

string s = Encoding.Default.GetString(a);
byte[] aa = Encoding.Default.GetBytes(s);

这是因为您使用的是反向编码。编码用于将字符串编码为字节,然后再返回到字符串

在编码中,每个字符都有一组对应的字节,但并非每个字节都必须有一个对应的字符。这就是为什么不能将任意字节解码为字符串


使用编码
Default
会以这种方式误用它,因为它只对每个字符使用一个字节,而每个字节代码恰好都有一个字符。但是,这样使用它仍然没有意义。

这意味着你的
字节[]a
有一个不符合Unicode规则的字节顺序。

为了补充Guffa的答案,这里有一个详细的例子,说明你的代码在某些字节序列中是如何失败的,例如
0216

// Let's start with some character from the ancient Aegean numbers:
// The code point of Aegean One is U+10107. Code points > U+FFFF need two
// code units with two bytes each if you encode them in UTF-16 (Encoding.Unicode)
string aegeanOne = char.ConvertFromUtf32(0x10107);
byte[] aegeanOneBytes = Encoding.Unicode.GetBytes(aegeanOne);
// Length == 4 (2 bytes each for high and low surrogate)
// == 0, 216, 7, 221

// Let's just take the first two bytes.
// This creates a malformed byte sequence,
// because the corresponding low surrogate is missing.
byte[] a = new byte[2];
a[0] = aegeanOneBytes[0]; // == 0
a[1] = aegeanOneBytes[1]; // == 216

string s = Encoding.Unicode.GetString(a);
// == replacement character � (U+FFFD),
// because the bytes could not be decoded properly (missing low surrogate)

byte[] aa = Encoding.Unicode.GetBytes(s);
// == 253, 255 == 0xFFFD != 0, 216

string s2 = Encoding.Default.GetString(a);
// == "\0Ø" (NUL + LATIN CAPITAL LETTER O WITH STROKE)
// Results may differ, depending on the default encoding of the operating system

byte[] aa2 = Encoding.Default.GetBytes(s2);
// == 0, 216

什么是编码?他们怎么不平等?您是否检查每个元素的位置?是否可以添加a的值,以便可以直接复制您的问题?请不要将编码与encryption@Zhenia但是数组包含什么?哇:)你闻到知识+1