www.2527.com_澳门新葡8455手机版_新京葡娱乐场网址_
做最好的网站

支付中那八个编码难题,字符编码Unicode

2019-09-23 00:02 来源:未知

最近一直在搞各种编码问题,略有心得,与大家分享一番。

在 上篇文章重点讲解数据类型的转换,在此基础上再讲解函数调用。

ANSI、UTF-8、Unicode为字符代码的三种编码格式,一个字符可以被编码成ANSI、UTF-8或Unicode格式,这三种格式只是表现形式不一样,其表示内容是一样的。

System.Text提供了Encoding的抽象类,这个类提供字符串编码的方法。常用的编码方式主要有ASCII,Unicode,UTF8(Unicode编码的一种)。

1、函数调用

ANSI、UTF-8、Unicode


ANSI、UTF-8、Unicode为字符代码的三种编码格式,一个字符可以被编码成ANSI、UT-F8或Unicode格式,这三种格式只是表现形式不一样,其表示内容是一样的。如下表:

char ANSI(GBK) Unicode UTF-8
0xD6D0 0x4E2D 0xE4B8AD

Unicode有四种编码格式,UTF-8, UTF-16,UTF-32,UTF-7。

c 中函数

ANSI编码

ANSI表示英文字符时用一个字节,表示中文用两个字节

为了使计算机支持多种语言,不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。

对于ANSI编码而言,0x00~0x7F之间的字符,依旧是1个字节代表一个字符(ASCII编码),而这之外的字符通常是使用0x80~0xFF范围内的两个字节来表示一个字符。比如汉字找那个的'中'在简体中文中使用[0xD6, 0xD0]这两个字节存储。

下表中展示了在不同ANSI标准下的编码:

char ANSI(GBK) ANSI(Big5) ANSI(JIS) Unicode UTF-8
0xCEC4 0xA4E5 0x95B6 0x6587 0xE69687

可以看出,不同ANSI编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。需要将不同的ANSI编码都转换成UTF-8编码,进而存储

字符编码类,ASCIIEncoding ,UTF7Encoding,UnicodeEncoding,UTF32Encoding。

INF_NET_API  INF_RESULT WINAPI INF_NET_GetList(long  lLoginHandle,DWORD dwInfoContol,BYTE**  pBuf,LONG&  lBufSize);

Unicode编码

Unicode字符集编码全称:Universal Multiple-Octet Coded Character Set,通用多八位编码字符集。Unicode字符集是国际组织制定的可以容纳世界上所有文字和符号的编码方案。

Unicode编码使用两个字节(0x0000-0xFFFF)来表示一个字符,世界上任何文字和符号都对应于Unicode字符集中的一个二进制代码,但是:

Unicode只是一个符号集, 它只规定了符号的二进制代码, 却没有规定这个二进制代码应该如何存储。

Unicode编码的优点是覆盖了世界上所有的文字和符号,缺陷则是对于英文字符浪费了一个字节。例如:英文A在unicode中表示为0x0041。

下面对ASCII和Unicode编码进行对比,废话不说,先上代码:

 

UTF-8编码

UTF-8是Unicode的实现方式之一。

UTF-8全称:8bit Unicode Transformation Format,8比特Unicode通用转换格式。UTF-8是一种针对Unicode的可变长度字符编码。可以表示Unicode标准中的任何一个字符,且其编码中的第一个字节仍然与ASCII兼容。

UTF-8是一种变长的编码方式,可以使用1~6个字节对Unicode字符集进行编码,编码规则如下:

  1. 对于单字节的符号, 字节的第一位设为0, 后面7位为这个符号的unicode码. 因此对于
    英语字母, UTF-8编码和ASCII码是相同的.

  2. 对于n字节的符号(n>1), 第一个字节的前n位都设为1, 第n 1位设为0, 后面字节的前
    两位一律设为10. 剩下的没有提及的二进制位, 全部为这个符号的unicode码.

n Unicode符号范围 UTF-8编码方式
1 0000 0000 - 0000 007F 0xxxxxxx
2 0000 0080 - 0000 07FF 110xxxxx 10xxxxxx
3 0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
4 0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5 0020 0000 - 03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6 0400 0000 - 7FFF FFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

注:在UTF-8编码中,英文字符占一个字节,中文字符占用3个字节。

这是ASCII编码、解码。

C# 中函数

总结

1、中文操作系统默认ansi编码,生成的txt文件默认为ansi编码。

2、国际文档(txt和xml)使用unicode编码是正宗做法;操作系统和浏览器都能够“理解”unicode编码。浏览器“迫于压力”才“理解”utf-8编码。但是,操作系统有时只认unicode编码。

3、Windows记事本有四个编码选项:ANSI、Unicode、Unicode Big Endian和UTF-8。

  • ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。
  • Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。这个选项用的little endian格式。
  • Unicode big endian编码与上一个选项相对应。采用big endian格式。
  • UTF-8指带BOM 的UTF-8。

图片 1图片 2

  [DllImport(_strCoreSDK)]
        public static extern int INF_NET_GetList(Int32 lLoginHandle, UInt32 dwInfoContol,IntPtr _Deviceinfoptr, ref Int32 lBufSize);

ANSI、UTF-8、Unicode转换


 1         static void Main(string[] args) 2         { 3             string temp = "Hello World!"; 4             Console.WriteLine("Original String:{0}", temp); 5              6             byte[] tempBytes = System.Text.Encoding.ASCII.GetBytes; 7             Console.WriteLine("Bytes Array:{0}", BitConverter.ToString(tempBytes)); 8  9             BigInteger integer = new BigInteger(tempBytes);10             Console.WriteLine("BigInteger:{0}", integer);11 12             string res = System.Text.Encoding.ASCII.GetString(tempBytes);13             Console.WriteLine("Convert Back String:{0}", res);14             Console.ReadKey();15         }

 

Windows Unicode and Character Sets

Unicode编码字符集是最通用的字符编码标准,Windows应用程序使用Unicode字符集的UTF-16实现版本。同时,Windows也支持传统的字符集:单字节字符集(Single-byte character sets, SBCS)和多字节字符集(Multibyte character sets)。

很多Windows API函数拥有“A”和“W”版本,“A”版本基于Windows Code Page,而“W”版本则基于Unicode字符。应用程序可以通过WideCharToMultiByteMultiByteToWideChar两个函数来转换Unicode字符串和基于Windows Code Page字符串。虽然函数名中含有“MultiByte”,这些函数实际上能处理SBCS、DBCS和multibyte character set Code page。

View Code

说明:常见的数值类型,正常转化;指针类型、引用类型直接转化为ref 数值类型。其中byte ** ,这种类型根据在c 中调用,是存储数组的地址,所以在单纯的用ref,不能解决问题。针对此问题,都可以用intptr,关键就是intptr怎么指向,下面重点讲讲如何结构体怎么访问。

编码转换

在Windows平台下,ANSI、UTF-8、Unicode三者之间的转换主要依赖于WideCharToMultiByteMultiByteToWideChar两个函数。

  • Unicode转UFT-8:设置WideCharToMultiByte的CodePage参数为CP_UTF8;
  • UTF-8转Unicode:设置MultiByteToWideChar的CodePage参数为CP_UTF8
  • Unicode转ANSI:设置WideCharToMultiByte的CodePage参数为CP_ACP;
  • ANSI转Unicode:设置MultiByteToWideChar的CodePage参数为CP_ACP;
  • UTF-8转ANSI:先将UTF-8转换为Unicode,再将Unicode转换成ANSI;
  • ANSI转UTF-8:先将ANSI转换为Unciode,再将Unicode转换成ANSI。

运行结果如下:

在函数调用时为:


本文内容应该存在错误或者是以偏概全的问题,后续会继续深入了解。

Original String:Hello World!Bytes Array:48-65-6C-6C-6F-20-57-6F-72-6C-64-21BigInteger:10334410032597741434076685640Convert Back String:Hello World!
iErr = INF_NET_GetList(g_lHandle, 5, (BYTE**)&m_pMonitorInfo, lMonSize);

很正常,对吧?但是,如果输入的字符串是中文(或者其他非ASCII表中的字符),情况会怎么样呢?

 

改变上面的程序代码

其中m_pMonitorInfo是结构体数组,所以此函数是获取一系列结构体,针对此,在c#函数中相对应声明为Intptr。

string temp = "你好,世界!";

C#中看看如何利用Intptr,传入地址,还有获取数据。

运行结果如下:

图片 3图片 4

Original String:你好,世界!Bytes Array:3F-3F-3F-3F-3F-3FBigInteger:69540876599103Convert Back String:??????
 int iDev_size = Marshal.SizeOf(typeof(INFINOVASDK.INF_NET_DEVICE_INFO));
                //定义一个存储指针的数组
                IntPtr[] _IntptrDevArray = new IntPtr[1];
                //初始化指针数组大小
                _IntptrDevArray[0] = Marshal.AllocHGlobal(iDev_size * 100);//分配包含100元素的数组
                //查询设备指针
                IntPtr _IntptrDevInfo = Marshal.AllocHGlobal(iDev_size);
                //存储设备指针于数组指针
                Marshal.Copy(_IntptrDevArray, 0, _IntptrDevInfo, 1);//拷贝指针数组
                int buffeesize = 0;
                int err = INFINOVASDK.INF_NET_GetList(_loginIds[control], 3, _IntptrDevInfo, ref buffeesize);
                if (err != 0)
                {
                    return null;
                }

                //从指针数组开始获取数据
                for (int i = 0; i < 100; i  )
                {
                    //设定好指针的偏移量
                    INFINOVASDK.INF_NET_DEVICE_INFO _deviceInfo = (INFINOVASDK.INF_NET_DEVICE_INFO)Marshal.PtrToStructure((IntPtr)((UInt32)_IntptrDevArray[0]   i * iDev_size), typeof(INFINOVASDK.INF_NET_DEVICE_INFO));

                    if (_deviceInfo.cDevIP != null)
                    {
                        //获取设备的Ip以及MAC
                        bytes_DevIp = _deviceInfo.cDevIP;
                        bytes_Mac = _deviceInfo.cDevMac;
                        break;
                    }

                }
                //释放申请的内存空间
                Marshal.FreeHGlobal(_IntptrDevInfo);
                Marshal.FreeHGlobal(_IntptrDevArray[0]);

如果把编码格式换成UTF8,依然重复上面的测试过程。

View Code

图片 5图片 6

 

 1         static void Main(string[] args) 2         { 3             string temp = "你好,世界!"; 4             Console.WriteLine("Original String:{0}", temp); 5              6             byte[] tempBytes = System.Text.Encoding.UTF8.GetBytes; 7             Console.WriteLine("Bytes Array:{0}", BitConverter.ToString(tempBytes)); 8  9             BigInteger integer = new BigInteger(tempBytes);10             Console.WriteLine("BigInteger:{0}", integer);11 12             string res = System.Text.Encoding.UTF8.GetString(tempBytes);13             Console.WriteLine("Convert Back String:{0}", res);14             Console.ReadKey();15         }

下面讲讲另一个函数
c 函数

View Code

INF_NET_API  INF_RESULT WINAPI INF_NET_FindFile (long &  lFindHandle, INF_HANDLE    lLoginHandle, LPINDEX_INFO pFindCondition,LPINDEX_INFO  pRecvIndex);   

运行结果如下:

上面函数中后两个参数,类型都是结构体指针,但是在函数调用的时,不一样。倒数第二个是传入结构体的指针,指向一个结构体。倒数第一个指向结构体数组的,是 获取的结构体数组。

Original String:你好,世界!Bytes Array:E4-BD-A0-E5-A5-BD-EF-BC-8C-E4-B8-96-E7-95-8C-EF-BC-81BigInteger:-10998968812899434720462615123889939386679836Convert Back String:你好,世界!

Original String:Hello World!Bytes Array:48-65-6C-6C-6F-20-57-6F-72-6C-64-21BigInteger:10334410032597741434076685640Convert Back String:Hello World!
   [DllImport(_strCoreSDK)]
        public static extern int INF_NET_FindFile(ref Int32 lFindHandle, Int32 lLoginHandle, IntPtr FIleptr, IntPtr RecordFileInfo);

通过对比,我们发现除了兼容中文和其他语言外,似乎没有太大区别。如果把编码集换成Unicode,中英文字符编码的不同就会很容易看出来了。

接口函数,按照说明进行声明。

Original String:Hello World!Bytes Array:48-00-65-00-6C-00-6C-00-6F-00-20-00-57-00-6F-00-72-00-6C-00-64-00-21-00BigInteger:3160918205608148134863399242437668999277801104545742920Convert Back String:Hello World!

Original String:你好,世界!Bytes Array:60-4F-7D-59-0C-FF-16-4E-4C-75-01-FFBigInteger:-307722159543719876182061216Convert Back String:你好,世界!

 C#函数调用,此方法和上面还不太相同。

如果不考虑其他情况。通过对比结果,我们发现:

 //初始化查询录像文件对象

1、ASCII只能处理英文和英文符号,具体请参考ASCII字符表

图片 7图片 8

2、Unicode可以处理全球所有语言符号

 INFINOVASDK.NET_INDEX_INFO _FindFileInfo = new INFINOVASDK.NET_INDEX_INFO();

            _FindFileInfo.dwStartTime = (uint)DatetimeToLong(startTime);
            _FindFileInfo.dwEndTime = (uint)DatetimeToLong(endTime);
            //查询条件,全部文件
            _FindFileInfo.btFileType = (byte)0xFF;
            //摄像机ID
            _FindFileInfo.dwIP4 = UInt32.Parse(cameraId);
            //平台设备的Ip、以及MAc
            _FindFileInfo.dwIP1 = BitConverter.ToUInt32(bytes_DevIp, 0);
            _FindFileInfo.wChan = UInt16.Parse(devicechn);
            _FindFileInfo.btMAC = bytes_Mac;
            _FindFileInfo.dwReserved = 0;
            _FindFileInfo.Reserved = new byte[2];//此处应初始化,防止向指针赋值时出错。

            try
            {
                List<FileItem> files = new List<FileItem>();
                //开始获取录像文件,并定义最多取100个文件

                //开始设置查询录像文件的指针
                int iIndexSize = Marshal.SizeOf(typeof(INFINOVASDK.NET_INDEX_INFO));
                IntPtr _IntptrInedx = Marshal.AllocHGlobal(iIndexSize);
                Marshal.StructureToPtr(_FindFileInfo, _IntptrInedx, false);//在用Marshal类进行托管对象和非托管对象的转换时,会有如下错误提示:“未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配。”所以针对结构体内数组要初始化,再赋值。看看赋值结构体内数组大小和初始化时结构体内数组大小是否相等。
                //定义存储录像文件数组,并初始化
                INFINOVASDK.NET_INDEX_INFO[] _ArrayFile = new INFINOVASDK.NET_INDEX_INFO[1024 * 10];
                for (int i = 0; i < _ArrayFile.Length; i  )
                {//结构体初始化,防止出错
                    _ArrayFile[i] = new INFINOVASDK.NET_INDEX_INFO();
                    _ArrayFile[i].Reserved = new byte[2];//针对数组专门初始化,关键是指明大小。
                    _ArrayFile[i].btMAC = new byte[6];

                }
                //录像文件数组定义个指针,并在内存空间申请的大小
                IntPtr _IntptrRecordFiles = Marshal.AllocHGlobal(iIndexSize * 1024 * 10);
                //查询录像文件
                int iFindhandle = 0;
                _errorCode = INFINOVASDK.INF_NET_FindFile(ref iFindhandle, _loginIds[control], _IntptrInedx, _IntptrRecordFiles);
                if (_errorCode != 0)
                {
                    return null;
                }
                for (int i = 0; i < 10240; i  )
                {
                    _ArrayFile[i] = (INFINOVASDK.NET_INDEX_INFO)Marshal.PtrToStructure((IntPtr)((UInt32)_IntptrRecordFiles   i * iIndexSize), typeof(INFINOVASDK.NET_INDEX_INFO));

                    if (_ArrayFile[i].dwStartTime != 0)
                    {
                        _NetRecordFiles.Add(_ArrayFile[i]);
                        //获取录像文件的起止时间
                        DateTime tempstart = LongToDateTime(_ArrayFile[i].dwStartTime);//将datetime格式转化为int类型。
                        DateTime tempend = LongToDateTime(_ArrayFile[i].dwEndTime);
                        string strstarttime = tempstart.ToString("yyyyMMddHHmmss");
                        string strendtime = tempend.ToString("yyyyMMddHHmmss");
                        FileItem _RecordFile = new FileItem();
                        _RecordFile.FileName = strstarttime   "_"   strendtime;
                        _RecordFile.StartTime = tempstart;
                        _RecordFile.EndTime = tempend;
                        files.Add(_RecordFile);

                    }

                }
                Marshal.FreeHGlobal(_IntptrInedx);
                Marshal.FreeHGlobal(_IntptrRecordFiles);
                return files;
            }

3、Unicode处理英文时,会在每个字节后面加一个字节0x00,比ASCII多出一倍的长度;处理中文时,编码较短。

View Code

4、UTF8处理中文时比Unicode编码长,处理英文时与ASCII一样。

 

结论,由于现在存储介质越来越不值钱,在处理有非英文字符时,编码格式应该选择Unicode(或其子集UTF8等的任意一种编码格式),只有在确定程序只会处理英文的时候,才能选择ASCII编码。

这个是之前复杂版本。

 byte []_devipBytes = new byte [20];
 byte []_macbytes = new byte [6];
//此前结构体内将char[]改为了string,结构看到数据是乱码,所以需要进行数据转化。
  byte[] bytes = Encoding.UTF8.GetBytes(_deviceInfo.cDevIP);  //_deviceInfo.cDevIP是string类型
//编码转化
   byte[] tempdef = Encoding.Convert(Encoding.UTF8, Encoding.Default, bytes);
    //此处你会发现_devipBytes 原先大小为20,此时由于tempdef;为4,然后此时_devipBytes 也为4,这样是不对的。
   _devipBytes = tempdef;
   byte[] bytes1 = Encoding.UTF8.GetBytes(_deviceInfo.cDevMac);
   byte[] tempdef1 = Encoding.Convert(Encoding.UTF8, Encoding.Default, bytes1);
//所以byte复制到byte,用此方法,这样不会改便byte[]的大小
  Array.Copy(tempdef1, _macbytes, 6);

 

如果想byte转到string,可以一个个获取。

C# 默认的编码方式是Unicode,而调用的DLL规定只处理UTF8编码格式的字符串,DLL中的输入参数类型char*被我Marshal成byte[],输出参数类型char**被我Marshal成了string。用于接收时的string-->string(UTF8-->Unicode),会发现接受的数据string时为乱码,所以还要转化为char[],才能看到正确数据。用于发送时,还需要string-->byte[](Unicode-->UTF8)这样频繁的编码转换,看来编码转换并非想象中那么简单:所以针对这种现场,当char * 作为传入数据时,直接处理为char * 》》string。  
  (一)、Encoding和CharSet
 在C#中包装DLL的时候,DllImportAttribute当中的选项CharSet着:规定封送字符串应使用何种字符集,其中枚举值有Ansi和Unicode,CharSet是字符集,用于字符传送,Encoding代表编码方式,用于数据转化。字符集是字符的集合,规定这个集合里有哪些字符,每个字符都有一个整数编号(只是编号不是编码);而编码是用来规定字符编号如何与二进制交互,每个“字符”分别用一个字节还是多个字节存储。CharSet表明在数据封送的字符集以什么方式封送,然后在获取到数据为乱码时,则通过Encoding里面的函数,将数据转化,则获取到正确数据。
  (二)、Ansi、Unicode、UTF8、bala bala
   提到字符集,有ASCII、GB2312、GBK、GB18030、BIG5、JIS等等多种,与此相对应的编码方式为ASCII、GB2312、GBK、GB18030、BIG5、JIS,但是Unicode字符集却有多种编码方式:UTF-8、 UTF-7、UTF-16、 UnicodeLittle、UnicodeBig,意味可以讲数据按照上述编码方式进行转化。   Ansi:系统编码的发展经历了三个阶段,ASCIIàAnsi(不同国家语言本地化)àUnicode(标准化),原来Ansi编码也好,Ansi字符集也好,都是指本地化的东西,在简体中文系统下,ANSI 编码代表 GB2312 编码,Windows下自带的记事本程序,默认的就是ANSI编码。输入“anhui合肥”(不含引号),保存编码方式选“ANSI”,查看,哦,9个字节,明白了,原来Ansi编码保留了对ASCII编码的兼容,当遇到ASCII字符时,采用单字节存储,当遇到非ASCII编码时,采用双字节表示(GB2312编码)。
  (三)、DllImportAttribute中的CharSet枚举值选择
  对字符集和编码的概念清楚了以后,终于可以研究C#中调用非托管的DLL的方法咯。从托管应用程序去调用非托管代码,如果CharSet=Unicode,则DLL中的接口函数将出现的所有字符串(包括参数和返回值)视为Unicode字符集,Ansi一样的道理
  第一:我需要调用非托管代码,第二:非托管代码只处理UTF8编码格式的字符,第三,万恶的中文乱码,接口函数签名中,无论参数还是返回值,接收到或是发送出的字符串都含有中文。首先接收字符串,因为接收到的是UTF8编码格式,CharSet属性肯定要设置成Unicode了,接收后要正确显示中文,在当前系统中,需要将编码方式转换成GB2312,即Encoding.Default;另外关于发送字符数组,因为无论是C#中默认的Unicode编码方式,还是DLL处理时规定的UTF8编码方式,都是Unicode字符集的一种编码方式,所以CharSet也要设置成Unicode,只是要在发送前需要将字符数组转换一下编码方式。以下附带两个简单的函数实现。
// 转换接收到的字符串

图片 9图片 10

public string UTF8ToUnicode(string recvStr)
{
byte[] tempStr = Encoding.UTF8.GetBytes(recvNotify);
byte[] tempDef = Encoding.Convert(Encoding.UTF8, Encoding.Default, tempStr);
    string msgBody = Encoding.Default.GetString(tempDef);
    return msgBody;
}
// 转换要发送的字符数组
public byte[] UnicodeToUTF8(string sendStr)
{
    string tempStr = Encoding.UTF8.GetString(sendStr);
    byte[] msgBody = Encoding.UTF8.GetBytes(tempUTF8);
    return msgBody;
}  

View Code

 

    下面是常用的几个函数

图片 11图片 12

 private DateTime LongToDateTime(uint times)
        {
            long _times =(long)times   28800;
            DateTime ds = new DateTime(1970, 1, 1, 0, 0, 0,DateTimeKind.Unspecified).AddSeconds(_times);
            return ds;
        }

        private byte [] StructToBytes(Object structobj , int size)
        {
            byte []tempBytes = new byte [size];
            IntPtr strcutIntptr = Marshal.AllocHGlobal(size);
            //将结构体拷贝到内存中
            Marshal.StructureToPtr(structobj, strcutIntptr, false);
            //从内存空间拷贝到byte数组中
            Marshal.Copy(strcutIntptr, tempBytes, 0, size);
            Marshal.FreeHGlobal(strcutIntptr);
            return tempBytes;

        }

        private object BytesToStruct(byte[] bytes ,Type _type)
        {
            int _size = Marshal.SizeOf(_type);
            IntPtr structInnptr = Marshal.AllocHGlobal(_size);
            Marshal.Copy(bytes, 0, structInnptr, _size);
            object obj = Marshal.PtrToStructure(structInnptr, _type);
            Marshal.FreeHGlobal(structInnptr);
            return obj;
        }

        private byte [] IntptrToBytes (IntPtr tempIntptr ,int _size)
        {
            byte[] tempBytes = new byte[_size];
            //从内存空间拷贝到byte数组中
            Marshal.Copy(tempIntptr, tempBytes, 0, _size);
            return tempBytes;
        }

        private IntPtr BytesToInptr(byte[] bytes, Type _type)
        {
            int _size = Marshal.SizeOf(_type);
            IntPtr structInnptr = Marshal.AllocHGlobal(_size);
            Marshal.Copy(bytes, 0, structInnptr, _size);
            return structInnptr;
        }

View Code

 

   

 

TAG标签:
版权声明:本文由澳门新葡8455手机版发布于计算机编程,转载请注明出处:支付中那八个编码难题,字符编码Unicode