在网络传输和文件操做中,若是数据量很大,须要将其划分为较小的快,此时可能出现一个数据块的末尾是一个不匹配的高代理项,而与其匹配的低代理项在下一个数据块。数组
这时候使用Encoding的GetBytes方法处理较为麻烦,咱们直接使用Encoder处理。网络
Encoder能够将一组字符编码为一个字节序列。而Decoder能够将已编码的字节序列解码为字符序列。app
若要获取的实现的实例 Encoder 类,应用程序应使用 GetEncoder 方法 Encoding 实现。ui
GetByteCount 方法肯定多少个字节进行编码的一组 Unicode 字符和 GetBytes 方法执行实际的编码。 这两种方法的几个版本中有 Encoder 类。 有关详细信息,请参阅Encoding.GetBytes。编码
一个 Encoder 对象之间维护状态信息对连续调用 GetBytes 或 Convert 方法,以便它能够正确编码字符跨块的序列。 Encoder 还保留尾随字符数据块的末尾,并在下一步编码操做中使用尾随字符。spa
例如,一个数据块的末尾可能不匹配的高代理项,而且匹配的低代理项可能在下一个数据块中。 所以, GetDecoder 和 GetEncoder 在网络传输和文件操做颇有用,由于这些操做一般处理的数据而不是完整的数据流块。3d
若要获取的实现的实例 Decoder 类,应用程序应使用 GetDecoder 方法 Encoding 实现。代理
GetCharCount 方法肯定有多少个字符致使个字节的序列进行解码和 GetChars 方法执行实际的解码。 这两种方法的几个版本中有 Decoder 类。 有关详细信息,请参阅Encoding.GetChars。 code
一个 Decoder 对象之间维护状态信息对连续调用 GetChars 或 Convert 方法,所以它能够正确地对跨块的字节序列进行解码。 Decoder 还保留在数据块的末尾的尾部字节,并在下一步的解码操做中使用的尾随字节。 orm
所以, GetDecoder 和 GetEncoder 很是有用的网络传输和文件操做,由于这些操做一般处理的数据而不是完整的数据流块。
1 string str = "在下坂本,有何贵干@@"; 2 Char[] chars = str.ToCharArray(); 3 Debug.Log("String="+new string(chars)); 4 //得到Encoder实例; 5 Encoder encoder = Encoding.UTF8.GetEncoder(); 6 //计算字符序列化须要的字节数组长度; 7 byte[] bytes = new byte[encoder.GetByteCount(chars,0,chars.Length,true)]; 8 //经过GetBytes转为字节序列; 9 encoder.GetBytes(chars, 0, chars.Length, bytes, 0, true); 10 Debug.Log(BitConverter.ToString(bytes)); 11 Debug.Log("Encoding.UTF8.GetString=" + Encoding.UTF8.GetString(bytes)); 12 //得到Decoder实例; 13 Decoder decoder = Encoding.UTF8.GetDecoder(); 14 //计算字节数组对应的字符数组长度; 15 int charSize = decoder.GetCharCount(bytes, 0, bytes.Length); 16 Char[] chs = new char[charSize]; 17 //进行字符转换; 18 int charLength = decoder.GetChars(bytes, 0, bytes.Length, chs, 0); 19 Debug.Log("Decoder Bytes to String =" + new string(chs));
//output:
MSDN Encoder >>> https://msdn.microsoft.com/zh-cn/library/system.text.encoder%28v=vs.110%29.aspx
MSDN Decoder >>> https://msdn.microsoft.com/zh-cn/library/system.text.decoder%28v=vs.110%29.aspx