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 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;
        }
时间: 2024-11-28 19:56:29

C# Encoding.Unicode.GetBytes / Encoding.Unicode.GetString 函数假想研究的相关文章

Encoding encoding = Encoding.GetEncoding(&quot;gb2312&quot;); 与byte[] ping = Encoding.UTF8.GetBytes(inputString);区别

Encoding encoding = Encoding.GetEncoding("gb2312"); 与byte[] ping = Encoding.UTF8.GetBytes(inputString);区别 public static string SubString(string inputString, int length)        {            byte[] ping = Encoding.UTF8.GetBytes(inputString);      

中文转换成Unicode编码 和 Unicode编码转换为中文

前几天,遇到一个问题,就是在浏览器地址栏传递中文时,出现乱码,考虑了一下,解决方式有很多,我还是采用了转换编码的方式,将中文转换为Unicode编码,然后再解码成中文,以下是实现的过程,非常简单! package cy.code; public class CyEncoder { private String zhStr; //中文字符串 private String unicode;//将中文字符串转换为Unicode编码 存储在这个属性上. public CyEncoder(String z

CString和string在unicode与非unicode下的相互转换(转)

原文转自 http://blog.csdn.net/u014303844/article/details/51397556 CString和string在unicode与非unicode下的相互转换 最近想写一个手机控制电脑的玩具,涉及到了socket通信,数据采用json通用格式,首先是jsoncpp的编译问题太烦了,然后还有更烦的,java中的String多容易的玩意儿,然后到了c/c++/mfc中超级烦,搜索了很久的攻略,用了大把的时间,最后写了个这玩意儿出来,或许可以帮助到一些需要此的道

【Teradata】Latin和Unicode字符集转换(自定义函数udf_w936to16和udf16tow936)

1.安装UDF函数 (1)下载GBK2Unicode.zip,地址为https://downloads.teradata.com/tag/udf (2)windows或者Linux环境下使用bteq进行安装. 进入文件所在目录,输入如下命令(windows中使用dos) bteq .logon 192.168.253.222/citic_edw 输入口令后,输入如下命令 database syslib; .run file=16_936.sql 验证syslib库中是否存在udf_w936to1

unicode,ansi,utf-8,unicode big endian编码的区别

作者:于洋链接:https://www.zhihu.com/question/23374078/answer/69732605来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这

非Unicode工程读取Unicode文件

MyUnicodeReader.h #pragma once /************************************************************************/ /* 在“多字节字符集”属性的工程中读取Unicode文件 ** -----------------------------------注意------------------------------------------------------- ** -------------一定

VC中含中英文的\u格式UNICODE字符串转UNICODE可见字符串

JAVA使用UTF-8格式字符串,JAVA与C++通信时将UTF-8串转为UNICODE串,如“ABCDabcd中国人民下沙123.杭州”转为UNICODE后外观如下: \u41\u42\u43\u44\u61\u62\u63\u64\u4e2d\u56fd\u4eba\u6c11\u4e0b\u6c99\u31\u32\u33\u2e\u676d\u5dde VC中如下处理即可转回来 CString CXXClass::UnicodeToString() { CString strUnicod

java 中文转换成Unicode编码和Unicode编码转换成中文

转自:一叶飘舟 http://blog.csdn.net/jdsjlzx/article/details/7058823 package lia.meetlucene; import java.io.IOException; import org.apache.lucene.index.CorruptIndexException; public class Unicode { public static void main(String[] args) throws CorruptIndexEx

VC++ 工程添加 Unicode Debug和Unicode Release编译支持

转载:http://blog.csdn.net/djhdu/article/details/171766 转载:http://blog.163.com/long_lh/blog/static/27693480200799112658267/ 转载:http://blog.sina.com.cn/s/blog_8a7012cf0101dy7w.html 一.添加UnicodeRelease的操作步骤: UnicodeRelease