我们很多人都知道Encoding.Unicode这个东东,它是用于获取字符串的Unicode字节流包括把Unicode字节流转换成.NET上的一个通用字符串String,但是有很多人却不知道它内部是如何实现的,当年我是通过MultiByteToWideChar
与WideCharToMultiByte实现的,但是我并不知道内部的实现方式。
首先我们需要理解Unicode字符串在内存中是怎么存储的,Unicode规定一个字符占用两个字节与wchar_t的长度一致
我为什要提这个是因为若你不知道有有多长你很难编写代码下去 除非你Ctrl + C && Ctrl + V
在内存中一个字符串假设为 “中” 它的对应short int value为20013那么在内存中它会是这样存储

X
low: 0010 1101
high: 0100 1110
√
low: 1011 0100
high: 0111 0010
左边为低位,右边为高位。高位是低位的一次幂,一个byte拥有8/bit二进制
形式:1111 1111 如果计算为十进制介质范围在0~255及256次
那么我们可以通过上述内容 可以得到 公式: (low * 256 ^ 0) + (high * 256 ^ 1)

示例代码:
        private void Form1_Load(object sender, EventArgs e)        {            byte[] bfx = GetUniocdeBytes("中国");            byte[] bfy = Encoding.Unicode.GetBytes("中国");            string str = GetUnicodeString(bfx);        }        private byte[] GetUniocdeBytes(string str)        {            int size = 0;            if(str != null && (size = str.Length) > 0)            {                byte[] buffer = new byte[size * 2];                for (int i = 0; i < size; i++)                {                    char chr = str[i];                    buffer[i * 2] = (byte)(chr & 0xff);                    buffer[i * 2 + 1] = (byte)(chr >> 8);                }                return buffer;            }            return new byte[size];        }        private string GetUnicodeString(byte[] buffer)        {            int size = 0;            if (buffer != null && (size = buffer.Length) >= 2)            {                size -= size % 2; // sizeof(wchar_t)                char[] value = new char[size / 2];                for (int i = 0; i < size; i += 2)                    value[i / 2] = (char)((buffer[i + 1] << 8) + buffer[i]);                return new string(value);            }            return string.Empty;        }