多字节转化为宽字节

本文介绍在Visual C++环境中如何进行多字节字符集(MBCS)与宽字符集(Unicode)之间的转换。提供了两种实用的转换方法,并通过示例代码详细展示了char*与CString相互转换的过程。

资料转载自:

http://hi.baidu.com/%C7%D8%B7%E7%CF%FE%D4%C2%C3%F7/blog/item/889a927fa3e2a7f52e73b393.html

http://blog.youkuaiyun.com/cynthiamoonbeen/article/details/5818564

http://blog.youkuaiyun.com/xieqq8/article/details/5189970


字符集间的转换想必大家都有过比较痛苦的经历。VC6中的字符串使用的是多字节字符集(MBCS),简单地说,就是汉字字符每个占两个字节,英文字符每个占一个字节;而到了VC2005及以上的版本,都统一为宽字符集了(Unicode),简单地说,就是每个字符--不管是汉字字符还是英文字符--都占两个字节。由于很多的开源项目、库等,用的都是老式的多字节字符集,比如说套接字编程等等,这样的话,要在新的编程环境(VC2005以上)中使用含多字节字符集的源文件、函数等,就需要注意到这个问题。以下是一些好用的解决该问题的方法(实验环境VC2008):

方法一 :

  char *  转 CString

  利用A2T或A2W函数。

例如:

      char * p= "这是char*字符串" ;

     USES_CONVERSION ;
     CString strW = A2T (p);

     //或 CString strW = A2W (p);

 

  CString  char * 

 利用T2A或W2A函数。

例如:

   //接上例

   char * pA =T2A(strW);  

   //或者char * pA =T2W(strW);

 

方法二:

通过CStringA 和 CString 的构造函数,也能实现char* 和 CString的转换

char * 转 CString

例如:

char * p= "这是char*字符串" ;

CStringA strA(p);

CString strW(strA);

 

CStringchar *

CString strW=_T("这是TCHAR字符串");

CStringA strA(strW);

char *p = strA.GetBuffer();

 

-----------------------以下是一些测试数据---------------------

//VC2008-默认使用UNICODE
 int szA = sizeof(char);//szA值为1(字节)
 int szW = sizeof(TCHAR);//szW值为2(字节)

 
 //多字节字符集版(MBCS)--VC6使用
 char *p= "这是char的字符串";
 //--sizeof(p)是4,它得到的不是字符串长度,而是char *指针的长度(字节)

 

 //在定义了UNICODE后是Unicode版
 TCHAR *tp = _T("这是unicode字符串");
 
 CStringA strA(p);
 int nL = strA.GetLength ();  //nL值为16:汉字字符每个两个字节,英文字符每个字符一个字节

 CString strW(tp);
 int nLW = strW.GetLength (); //nLW值为12:它表明在strW中有12个字符。注意此GetLength()与上面的区别

 
 char *pA = new char[nL+1];
 TCHAR *pT = new TCHAR[nLW+1];

 szA = sizeof(pA);   //szA值为4
 szW = sizeof(pT);  //szW值为4

 ::memcpy (pA,strA.GetBuffer (),nL);
 pA[nL]='\0';       //缺少此句必然乱码

 ::wmemcpy (pT,strW.GetBuffer (),nLW);
 pT[nLW]='\0';   //缺少此句必然乱码


在不同的编程语言中,将字节换为int类型有不同的方法,以下分别介绍C#和Java的实现方式。 ### C# 在C#中,可以使用`BitConverter.ToInt32`方法将字节数组换为int类型。需要注意系统架构的字节序,如果是小端格式,可能需要反字节数组。示例代码如下: ```csharp using System; class Program { static void Main() { // 字节数组 byte[] bytes = { 0, 0, 0, 25 }; // 如果系统架构是小端格式,那么就把数组反 if (BitConverter.IsLittleEndian) Array.Reverse(bytes); int i = BitConverter.ToInt32(bytes, 0); Console.WriteLine("int: {0}", i); } } ``` 上述代码中,首先创建了一个字节数组,然后判断系统的字节序,如果是小端格式则反数组,最后使用`BitConverter.ToInt32`方法将字节数组换为int类型并输出结果。[^1] ### Java 在Java中,可以通过位运算将字节数组换为int类型。示例代码如下: ```java public class test { public static void main(String[] args) { byte[] bytes = new byte[4]; // 假设这里初始化字节数组 bytes[0] = 0; bytes[1] = 0; bytes[2] = 0; bytes[3] = 25; int result = bytes2int(bytes); System.out.println(result); } public static int bytes2int(byte[] bytes) { int a = bytes[0]; int b = (bytes[1] & 0xFF) << 8; int c = (bytes[2] & 0xFF) << 16; int d = (bytes[3] & 0xFF) << 24; return a | b | c | d; } } ``` 上述代码中,定义了`bytes2int`方法,该方法通过位运算将字节数组换为int类型。在`main`方法中,创建了一个字节数组并初始化,然后调用`bytes2int`方法进行换并输出结果。[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值