当前位置: 代码迷 >> C# >> C# Encoding.Unicode.GetBytes / Encoding.Unicode.GetString 函数假设研究
  详细解决方案

C# Encoding.Unicode.GetBytes / Encoding.Unicode.GetString 函数假设研究

热度:268   发布时间:2016-05-05 03:27:45.0
C# Encoding.Unicode.GetBytes / Encoding.Unicode.GetString 函数假想研究

我们很多人都知道Encoding.Unicode这个东东,它是用于获取字符串的Unicode字节流包括把Unicode字节流转换成.NET上的一个通用字符串String,但是有很多人却不知道它内部是如何实现的,当年我是通过MultiByteToWideChar

WideCharToMultiByte实现的,但是我并不知道内部的实现方式。

首先我们需要理解Unicode字符串在内存中是怎么存储的,Unicode规定一个字符占用两个字节与wchar_t的长度一致

我为什要提这个是因为若你不知道有有多长你很难编写代码下去 除非你Ctrl + C && Ctrl + V

在内存中一个字符串假设为 “中” 它的对应short int value20013那么在内存中它会是这样存储


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;        }

  相关解决方案