分享

字符编码转换_进制转换(GB2312,GBK,JNI,HexTOStr) (转)

 3D建模仿真 2015-01-09
  1. //////////////////////////////////////////////////////////////////////  
  2. /*  
  3. ASCII 英文一个字节   
  4. gb2312,gbk 中文两个字节,英文一个字节   
  5. 在中文系统中ansi一般指gb2312或gbk   
  6. GB2312、GBK都属于双字节字符集 (DBCS)   
  7. Utf-8 中文三个字节,英文一个字节   
  8. Unicode 中文两个字节,英文两个字 
  9. */  
  10. //////////////////////////////////////////////////////////////////////////  
  11. //////////////////////////////////////////////////////////////////////////  
  12. /* 
  13. GB2312 中国国家 标准码 
  14.  
  15.     ANSI码(American National Standards Institute) 
  16.     美国国家  标准学会 的 标准码 
  17.  
  18.     ASCII码(America Standard Code for Information Interchange)美国信息交换标准码 
  19.  
  20.     你可以认为是不同的东西! 
  21.     ANSI码仅在前126个与ASCII码相同 
  22. */  
  23. //////////////////////////////////////////////////////////////////////////  
  24.   
  25. //////////////////////////////////////////////////////////////////////////  
  26. /* 
  27. /* 
  28. *   二进制、八进制、十进制、十六进制转换   16进制和字符相互转换                                                                                                      
  29. */  
  30. //////////////////////////////////////////////////////////////////////////  
  31.   
  32. //////////////////////////////////////////////////////////////////////////  
  33. /* 
  34.     java内部是使用16bit的unicode编码(UTF-16)来表示字符串的,无论中文英文都是2字节; 
  35.     jni内部是使用UTF-8编码来表示字符串的,UTF-8是变长编码的unicode,一般ascii字符是1字节,中文是3字节; 
  36.     c/c++使用的是原始数据,ascii就是一个字节了,中文一般是GB2312编码,用两个字节来表示一个汉字。 
  37. */  
  38. //////////////////////////////////////////////////////////////////////////  
  39.   
  40. //////////////////////////////////////////////////////////////////////////  
  41. //   CodeConver.h  
  42. //////////////////////////////////////////////////////////////////////////  
  43.   
  44. #ifndef CodeConver_H  
  45. #define CodeConver_H  
  46.   
  47. namespace CodeConvert  
  48. {  
  49.   
  50.     #include <stdio.h>  
  51.     #include <string.h>  
  52.     #include <windows.h>  
  53.     #include <assert.h>  
  54.     #include <jni.h>  
  55.     #include <jni_md.h>  
  56.   
  57.     //   ANSI To Unicode  
  58.     //   测试通过  
  59.     wchar_t * ANSIToUnicode( const char* str )  
  60.     {  
  61.         int textlen ;  
  62.         wchar_t * result;  
  63.    
  64.         textlen = MultiByteToWideChar( CP_ACP, 0, str,-1, NULL,0 );   
  65.         if (textlen ==0)  
  66.         {  
  67.             return NULL;  
  68.         }  
  69.         result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));   
  70.         memset(result,0,(textlen+1)*sizeof(wchar_t));   
  71.         MultiByteToWideChar(CP_ACP, 0,str,-1,(LPWSTR)result,textlen );   
  72.         return result;   
  73.     }  
  74.   
  75.     /************************************************************************/  
  76.     //  Unicode  To ANSI(美国国家标准码)  
  77.     //  测试通过  
  78.     //  [2/8/2012 liu]  
  79.     /************************************************************************/  
  80.     char * UnicodeToANSI( const wchar_t* str )  
  81.     {  
  82.         char* result;  
  83.         int textlen;  
  84.         textlen = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL );  
  85.         if (textlen ==0)  
  86.         {  
  87.             return NULL;  
  88.         }  
  89.         result =(char *)malloc((textlen+1)*sizeof(char));  
  90.         memset( result, 0, sizeof(char) * ( textlen + 1 ) );  
  91.         WideCharToMultiByte( CP_ACP, 0, str, -1, result, textlen, NULL, NULL );  
  92.         return result;  
  93.     }  
  94.   
  95.     /************************************************************************/  
  96.     //  UTF8 To Unicode  
  97.     //  [2/8/2012 liu]  
  98.     //  测试通过  
  99.     /************************************************************************/  
  100.     int   UTF8ToUnicode( wchar_t * &result,const char* utf8 )  
  101.     {  
  102.         int textlen ;  
  103.         textlen = MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)utf8,-1, NULL,0 );   
  104.         if (textlen == 0)  
  105.         {  
  106.             return NULL;  
  107.         }  
  108.         result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));   
  109.         memset(result,0,textlen * 2 + 2);   
  110.         int widelen = MultiByteToWideChar(CP_UTF8, 0,(LPCSTR)utf8,-1,(LPWSTR)result,textlen );   
  111.         return widelen-1;  
  112.   
  113.     }  
  114.   
  115.     /************************************************************************/  
  116.     //  UnicodeToUTF8  
  117.     //  ????????  
  118.     //  [2/8/2012 liu]  
  119.     /************************************************************************/  
  120.     char * UnicodeToUTF8( const wchar_t* str )  
  121.     {  
  122.         char* result;  
  123.         int textlen;  
  124.         textlen = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL );  
  125.         if (textlen == 0)  
  126.         {  
  127.             return NULL;  
  128.         }  
  129.         result =(char *)malloc((textlen+1)*sizeof(char));  
  130.         memset(result, 0, sizeof(char) * ( textlen + 1 ) );  
  131.         WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL );  
  132.         return result;  
  133.     }  
  134.     /************************************************************************/  
  135.     //  宽字符 转换为 多字符  Unicode - ANSI  
  136.     //  ????????  
  137.     //  [2/8/2012 liu]  
  138.     /************************************************************************/  
  139.     char* w2m(const wchar_t* wcs)  
  140.     {  
  141.         int len;  
  142.         char* buf;  
  143.         if (wcs =NULL)  
  144.         {  
  145.             return NULL;  
  146.         }  
  147.         len =wcstombs(NULL,wcs,0);  
  148.         if (len == 0)  
  149.             return NULL;  
  150.         buf = (char *)malloc(sizeof(char)*(len+1));  
  151.         memset(buf, 0, sizeof(char) *(len+1));  
  152.         len =wcstombs(buf,wcs,len+1);  
  153.         return buf;  
  154.     }  
  155.   
  156.     /************************************************************************/  
  157.     //  多字符 转换为 宽字符  ANSI - Unicode  
  158.     //   
  159.     //  [2/8/2012 liu]  
  160.     /************************************************************************/  
  161.     wchar_t* multiByte_to_wideChar(const char* mbs)  
  162.     {  
  163.         int len;  
  164.         wchar_t* buf;  
  165.         if (mbs == NULL)  
  166.         {  
  167.             return NULL;  
  168.         }  
  169.         len =mbstowcs(NULL,mbs,0);  
  170.         if (len == 0)  
  171.             return NULL;  
  172.         buf = (wchar_t *)malloc(sizeof(wchar_t)*(len+1));  
  173.         memset(buf, 0, sizeof(wchar_t) *(len+1));  
  174.         len =mbstowcs(buf,mbs,len+1);  
  175.         return buf;  
  176.     }  
  177.   
  178.     /************************************************************************/  
  179.     //  ANSI To UTF8  
  180.     //  ??????  
  181.     //  [2/8/2012 liu]  
  182.     /************************************************************************/  
  183.     char* ANSIToUTF8(const char* str)  
  184.     {  
  185.         return UnicodeToUTF8(ANSIToUnicode(str));  
  186.     }  
  187.   
  188.     /************************************************************************/  
  189.     //  UTF8 To ANSI  
  190.     //  测试通过  
  191.     //  [2/8/2012 liu]  
  192.     /************************************************************************/  
  193.     char* UTF8ToANSI(const char* str)  
  194.     {  
  195.         wchar_t * temp;  
  196.         if (str == NULL)  
  197.         {  
  198.             return NULL;  
  199.         }  
  200.         UTF8ToUnicode(temp,str);  
  201.         return UnicodeToANSI(temp);  
  202.     }  
  203.   
  204.     ////////////////////////////////////////////////////////////////////////////////////  
  205.   
  206.     //  测试OK  
  207.     //  UTF8  convert to GB2312  
  208.     void UTF8ToGB2312( const char *  utf8, char * &gb2312 )  
  209.     {  
  210.         int nLen = MultiByteToWideChar( CP_UTF8, 0, utf8, -1, NULL, 0 );  
  211.         if (nLen == 0)  
  212.         {  
  213.             gb2312 = NULL;  
  214.             return ;  
  215.         }  
  216.           
  217.         USHORT* pwszGB2312 = new USHORT[ nLen + 1 ];  
  218.         RtlZeroMemory( pwszGB2312, nLen * 2 + 2 );  
  219.           
  220.         MultiByteToWideChar( CP_UTF8, 0, utf8, -1, pwszGB2312, nLen );  
  221.           
  222.         nLen = WideCharToMultiByte( CP_ACP, 0, pwszGB2312, -1, NULL, 0, NULL, NULL );  
  223.           
  224.         CHAR* pszGB2312 = new CHAR[ nLen + 1 ];  
  225.         RtlZeroMemory( pszGB2312, nLen + 1 );  
  226.           
  227.         WideCharToMultiByte( CP_ACP, 0, pwszGB2312, -1, pszGB2312, nLen, NULL, NULL );  
  228.           
  229.         gb2312 = pszGB2312;  
  230.           
  231.     //      delete [] pszGB2312;  
  232.     //      delete [] pwszGB2312;  
  233.     }  
  234.   
  235.     // GB2312 convert to UTF8  
  236.     //  测试通过  
  237.     int GB2312ToUTF8( const  char * gb2312,char * &utf8 )  
  238.     {  
  239.         int nLen1 = MultiByteToWideChar( CP_ACP, 0, gb2312, -1, NULL, 0 );  
  240.         if (nLen1 == 0)  
  241.         {  
  242.             return 0;  
  243.         }  
  244.           
  245.         USHORT* pwszUTF8 = new USHORT[ nLen1 + 1 ];  
  246.         RtlZeroMemory( pwszUTF8, nLen1 * 2 + 2 );  
  247.           
  248.         MultiByteToWideChar( CP_ACP, 0, gb2312, -1, pwszUTF8, nLen1 );  
  249.           
  250.         int nLen = WideCharToMultiByte( CP_UTF8, 0, pwszUTF8, -1, NULL, 0, NULL, NULL );  
  251.           
  252.         CHAR* pszUTF8 = new CHAR[ nLen + 1 ];  
  253.         RtlZeroMemory( pszUTF8, nLen + 1 );  
  254.           
  255.         WideCharToMultiByte( CP_UTF8, 0, pwszUTF8, -1, pszUTF8, nLen, NULL, NULL );  
  256.           
  257.         utf8 = pszUTF8;  
  258.   
  259.         return nLen1-1;  
  260.   
  261.     //  delete [] pszUTF8;  
  262.     //  delete [] pwszUTF8;  
  263.     }  
  264.   
  265.     //  Gb2312 To Unicode  
  266.     //  测试通过  
  267.     int  Gb2312ToUnicode(wchar_t * &OutUnicode,const char *gb2312)  
  268.     {  
  269.         char * utf8 = NULL;  
  270.         if (gb2312==NULL)  
  271.         {  
  272.             OutUnicode = NULL;  
  273.             return 0;  
  274.         }  
  275.         GB2312ToUTF8(gb2312,utf8);  
  276.         int len = UTF8ToUnicode(OutUnicode,utf8);  
  277.         return len;  
  278.     }  
  279.       
  280. //////////////////////////////////////////////////////////////////////////  
  281.   
  282.       
  283.   
  284. //////////////////////////////////////////////////////////////////////////  
  285.   
  286.      /************************************************************************** 
  287.      *                                                                        
  288.      *  函数名:  HexToString                                   
  289.      *                                                                         
  290.      *  描  述:  16进制 转为 字符串                               
  291.      *                                                                         
  292.      *  参  数:  IN:const char *pHex,IN:unsigned long hexLen, 
  293.      *           OUT:char *pByteString            
  294.      *                                                                         
  295.      *  返  回:  成功:0 ,   失败:1、2                                          
  296.      *   
  297.      *  作  者: liuguanglin       
  298.      * 
  299.     **************************************************************************/  
  300.     DWORD HexToString(/*IN*/  const char    * pHex,  
  301.                       /*IN*/  DWORD           hexLen,  
  302.                       /*OUT*/ char          * pByteString)  
  303.     {  
  304.         unsigned long i;  
  305.    
  306.         if (pHex==NULL)  
  307.             return 1;  
  308.           
  309.         if(hexLen <= 0)  
  310.             return 2;  
  311.           
  312.         for(i=0;i<hexLen;i++)  
  313.         {  
  314.             if(((pHex[i]&0xf0)>>4)>=0 && ((pHex[i]&0xf0)>>4)<=9)  
  315.                 pByteString[2*i]=((pHex[i]&0xf0)>>4)+0x30;  
  316.             else if(((pHex[i]&0xf0)>>4)>=10 && ((pHex[i]&0xf0)>>4)<=16)  
  317.                 pByteString[2*i]=((pHex[i]&0xf0)>>4)+0x37;   //  小写:0x37 改为 0x57   
  318.               
  319.             if((pHex[i]&0x0f)>=0 && (pHex[i]&0x0f)<=9)  
  320.                 pByteString[2*i+1]=(pHex[i]&0x0f)+0x30;  
  321.             else if((pHex[i]&0x0f)>=10 && (pHex[i]&0x0f)<=16)  
  322.                 pByteString[2*i+1]=(pHex[i]&0x0f)+0x37;      //  小写:0x37 改为 0x57   
  323.         }  
  324.         return 0;  
  325.     }  
  326.   
  327.     /************************************************************************** 
  328.      *                                                                        
  329.      *  函数名:  StringToHex                                   
  330.      *                                                                         
  331.      *  描  述:  字符串 转为 16进制                               
  332.      *                                                                         
  333.      *  参  数:  IN:const char *pHexBYTE,IN:DWORD dwStrLen,OUT:BYTE *pbHex            
  334.      *                                                                         
  335.      *  返  回:  成功:0 ,   失败:1、2                                          
  336.      *    
  337.      *  作  者: liuguanglin 
  338.      * 
  339.     **************************************************************************/  
  340.     DWORD StringToHex(/*IN*/  const BYTE * pByteString,  
  341.                       /*IN */ DWORD        dwStrLen,  
  342.                       /*OUT*/ BYTE       * pbHex)    
  343.     {  
  344.         DWORD i;  
  345.         DWORD dwRet;  
  346.         unsigned char * pTempBuf=NULL;  
  347.           
  348.         if (pByteString==NULL || pbHex==NULL)  
  349.             return 1;   
  350.           
  351.         if(dwStrLen <= 0)  
  352.             return 2;  
  353.           
  354.         if ((dwStrLen%2)!=0)  
  355.         {  
  356.             pTempBuf=(BYTE*)malloc(dwStrLen+2);  
  357.             pTempBuf[0]=0x30;  
  358.             memcpy(&pTempBuf[1],pByteString,sizeof(BYTE)*dwStrLen);  
  359.             dwRet=StringToHex(pTempBuf,dwStrLen+1,pbHex);  
  360.             free(pTempBuf);  
  361.             return dwRet;  
  362.         }  
  363.         else  
  364.         {   
  365.             for(i=0;i<dwStrLen;i++)  
  366.             {  
  367.                 if(i%2==0)  
  368.                 {  
  369.                     if(pByteString[i]>='0' && pByteString[i]<='9')  
  370.                         pbHex[i/2]=(pByteString[i]-0x30)<<4;  
  371.                     else if(pByteString[i]>='a' && pByteString[i]<='f')  
  372.                         pbHex[i/2]=(pByteString[i]-0x57)<<4;  
  373.                     else if(pByteString[i]>='A' && pByteString[i]<='F')  
  374.                         pbHex[i/2]=(pByteString[i]-0x37)<<4;  
  375.                     else  
  376.                         return 3;  
  377.                 }  
  378.                 else  
  379.                 {  
  380.                     if(pByteString[i]>='0' && pByteString[i]<='9')  
  381.                         pbHex[i/2]|=pByteString[i]-0x30;  
  382.                     else if(pByteString[i]>='a' && pByteString[i]<='f')  
  383.                         pbHex[i/2]|=pByteString[i]-0x57;  
  384.                     else if(pByteString[i]>='A' && pByteString[i]<='F')  
  385.                         pbHex[i/2]|=pByteString[i]-0x37;  
  386.                     else  
  387.                         return 4;  
  388.                 }  
  389.             }    
  390.         }  
  391.         return 0;  
  392.     }  
  393.   
  394.     /***************************************** 
  395.     HEX 到 ASCII 的转换函数 
  396.     入口参数: data: 转换数据的入口指针 
  397.     buffer: 转换后数据入口指针 
  398.     len : 需要转换的长度 
  399.     返回参数:转换后数据长度 
  400.     *******************************************/  
  401.     int  hex_2_ascii(char *data, char *buffer, int len)  
  402.     {  
  403.         const char ascTable[17] = {"0123456789ABCDEF"};  
  404.         char *tmp_p = buffer;  
  405.         int i, pos;  
  406.         pos = 0;  
  407.           
  408.         for(i = 0; i < len; i++)  
  409.         {  
  410.             tmp_p[pos++] = ascTable[data[i]>>4&0x0f];  
  411.             tmp_p[pos++] = ascTable[data[i] & 0x0f];  
  412.         }  
  413.         tmp_p[pos] = '\0';  
  414.         return pos;  
  415.     }  
  416.   
  417.     /***************************************** 
  418.     ASCII 到 HEX 的转换函数 
  419.     入口参数: O_data: 转换数据的入口指针, 
  420.     N_data: 转换后新数据的入口指针 
  421.     len : 需要转换的长度 
  422.     返回参数:-1: 转换失败 
  423.     其它:转换后数据长度 
  424.     注意:O_data[]数组中的数据在转换过程中会被修改。 
  425.     ****************************************/  
  426.     int  ascii_2_hex(char *O_data,char *N_data, int len)  
  427.     {  
  428.         int i,j,tmp_len;  
  429.         char tmpData;  
  430.         for(i = 0; i < len; i++)  
  431.         {  
  432.             if ((O_data[i] >= '0') && (O_data[i] <= '9'))  
  433.             {  
  434.                 tmpData = O_data[i] - '0';  
  435.             }  
  436.             else if ((O_data[i] >= 'A') && (O_data[i] <= 'F')) //A....F  
  437.             {  
  438.                 tmpData = O_data[i] - 0x37;  
  439.             }  
  440.             else if((O_data[i] >= 'a') && (O_data[i] <= 'f')) //a....f  
  441.             {  
  442.                 tmpData = O_data[i] - 0x57;  
  443.             }  
  444.             else{  
  445.                 return -1;  
  446.             }  
  447.             O_data[i] = tmpData;  
  448.         }  
  449.         for(tmp_len = 0,j = 0; j < i; j+=2)  
  450.         {  
  451.             N_data[tmp_len++] = (O_data[j]<<4) | O_data[j+1];  
  452.         }  
  453.         return tmp_len;  
  454.     }  
  455.   
  456.   
  457.   
  458.     /************************************************************************** 
  459.      *                                                                        
  460.      *  函数名:  Soft_swap                                   
  461.      *                                                                         
  462.      *  描  述:  RSA密钥 倒序                              
  463.      *                                                                         
  464.      *  参  数:  IN: void *dst, IN: const void *src, IN: size_t count            
  465.      *                                                                         
  466.      *  返  回:  无                                       
  467.      *    
  468.      *  作  者: liuguanglin 
  469.     **************************************************************************/  
  470.     void Soft_swap(void *dst,const void *src,size_t count)  
  471.     {  
  472.         int i;  
  473.         unsigned char *t;  
  474.         unsigned char *q = (unsigned char *)dst;  
  475.         unsigned char *p = (unsigned char*) src;  
  476.         t = q;  
  477.         if(t == p)  
  478.         {  
  479.             q = (unsigned char *)malloc(count);  
  480.             assert(q);  
  481.         }  
  482.         for( i=0; (size_t) i<count; i++ ) q[count-1 - i] = p[i];  
  483.         if(t == p) {  
  484.             memcpy(p, q, count);  
  485.             free(q);  
  486.         }  
  487.   
  488.     }  
  489.    
  490.     //////////////////////////////  编码转换  ////////////////////////////////////////////  
  491.   
  492.     //// UTF8 convert to GB2312  
  493.     VOID UTF82GB2312( /*IN*/ const char * utf8, /* OUT */ const char * gb2312 )  
  494.     {  
  495.         int nLen = MultiByteToWideChar( CP_UTF8, 0, utf8 , -1, NULL, 0 );  
  496.           
  497.         USHORT* pwszGB2312 = new USHORT[ nLen + 1 ];  
  498.         RtlZeroMemory( pwszGB2312, nLen * 2 + 2 );  
  499.           
  500.         MultiByteToWideChar( CP_UTF8, 0, utf8 , -1, pwszGB2312, nLen );  
  501.           
  502.         nLen = WideCharToMultiByte( CP_ACP, 0, pwszGB2312, -1, NULL, 0, NULL, NULL );  
  503.           
  504.         CHAR* pszGB2312 = new CHAR[ nLen + 1 ];  
  505.         RtlZeroMemory( pszGB2312, nLen + 1 );  
  506.           
  507.         WideCharToMultiByte( CP_ACP, 0, pwszGB2312, -1, pszGB2312, nLen, NULL, NULL );  
  508.           
  509.         gb2312 = pszGB2312;  
  510.           
  511.         delete [] pszGB2312;  
  512.         delete [] pwszGB2312;  
  513.     }  
  514.   
  515.     //// GB2312 convert to UTF8  
  516.     VOID GB23122UTF8( /*IN*/ const char * gb2312, /* OUT */ const char * utf8 )  
  517.     {  
  518.         int nLen = MultiByteToWideChar( CP_ACP, 0, gb2312 , -1, NULL, 0 );  
  519.           
  520.         USHORT* pwszUTF8 = new USHORT[ nLen + 1 ];  
  521.         RtlZeroMemory( pwszUTF8, nLen * 2 + 2 );  
  522.           
  523.         MultiByteToWideChar( CP_ACP, 0, gb2312 , -1, pwszUTF8, nLen );  
  524.           
  525.         nLen = WideCharToMultiByte( CP_UTF8, 0, pwszUTF8, -1, NULL, 0, NULL, NULL );  
  526.           
  527.         CHAR* pszUTF8 = new CHAR[ nLen + 1 ];  
  528.         RtlZeroMemory( pszUTF8, nLen + 1 );  
  529.           
  530.         WideCharToMultiByte( CP_UTF8, 0, pwszUTF8, -1, pszUTF8, nLen, NULL, NULL );  
  531.           
  532.         utf8 = pszUTF8;  
  533.           
  534.         delete [] pszUTF8;  
  535.         delete [] pwszUTF8;  
  536.     }   
  537.   
  538.   
  539. ////////////////////////////////////////////////////////////////////////////////////////////////////  
  540.       
  541. //-----------------------------------------------  JNI 部分  ---------------------------------------  
  542. /* 
  543.     java内部是使用16bit的unicode编码(UTF-16)来表示字符串的,无论中文英文都是2字节; 
  544.     jni内部是使用UTF-8编码来表示字符串的,UTF-8是变长编码的unicode,一般ascii字符是1字节,中文是3字节; 
  545.     c/c++使用的是原始数据,ascii就是一个字节了,中文一般是GB2312编码,用两个字节来表示一个汉字。 
  546. */  
  547.       
  548. ////////////////////////////////////////////////////////////////////////////////////////////////////  
  549.   
  550.   
  551.     //  测试Ok  
  552.     // 只适用于 window平台  
  553.     char* jstringToWindows( JNIEnv *env, jstring jstr )  
  554.     { // unicode(UTF-16) 转换成 GB2312  
  555.         int length = (env)->GetStringLength(jstr );  
  556.         const jchar* jcstr = (env)->GetStringChars(jstr, 0 );  
  557.         char* rtn = (char*)malloc( length*2+1 );  
  558.         int size = 0;  
  559.         size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );  
  560.         if( size <= 0 )  
  561.             return NULL;  
  562.         (env)->ReleaseStringChars(jstr, jcstr );  
  563.         rtn[size] = 0;  
  564.         return rtn;  
  565.     }  
  566.   
  567.   
  568.     //  测试Ok  
  569.     //  只适用于 window平台  
  570.     jstring WindowsTojstring( JNIEnv* env,const char* str )  
  571.     {   //GB2312转换成 unicode(UTF-16)  
  572.         jstring rtn = 0;  
  573.         int slen = strlen(str);  
  574.         unsigned short * buffer = 0;  
  575.         if( slen == 0 )  
  576.             rtn = (env)->NewStringUTF(str );  
  577.         else  
  578.         {  
  579.             int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );  
  580.             buffer = (unsigned short *)malloc( length*2 + 1 );  
  581.             if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )  
  582.             {  
  583.                 rtn = (env)->NewString(  (jchar*)buffer, length );  
  584.             }  
  585.             //   rtn = (env)->NewString(  (jchar*)buffer, length );  
  586.         }  
  587.         if( buffer )  
  588.             free( buffer );  
  589.           
  590.         return rtn;  
  591.     }  
  592.   
  593.   
  594.     /************************************************************************/  
  595.     //java jni中跨平台(win32或linux,unix)  String转为jstring 。                                                                       
  596.     /************************************************************************/  
  597.     jstring nativeTojstring( JNIEnv* env,const char* str )  
  598.     {      
  599.         jclass strClass = env->FindClass( "Ljava/lang/String;");   
  600.         jmethodID ctorID = env->GetMethodID( strClass, "<init>",   
  601.             "([BLjava/lang/String;)V");  
  602.           
  603.         if (env->ExceptionCheck() == JNI_TRUE || str == NULL)  
  604.         {  
  605.             env->ExceptionDescribe();  
  606.             env->ExceptionClear();  
  607.             printf("nativeTojstring函数转换时,str为空/n");  
  608.             return NULL;  
  609.         }  
  610.           
  611.         jbyteArray bytes = env->NewByteArray( strlen(str));   
  612.         //如果str为空则抛出异常给jvm  
  613.           
  614.         env->SetByteArrayRegion( bytes, 0,  strlen(str), (jbyte*)str);   
  615.         jstring encoding = env->NewStringUTF( "GBK");   
  616.         jstring strRtn = (jstring)env->NewObject( strClass, ctorID, bytes,   
  617.             encoding);  
  618.         //释放str内存  
  619.         // free(str);  
  620.         return strRtn;  
  621.     }  
  622.   
  623.     /************************************************************************/  
  624.     //java jni中跨平台(win32或linux,unix)  jstring转为String 。                                                                       
  625.     /************************************************************************/  
  626.     char* jstringToNative(JNIEnv *env, jstring jstr)  
  627.     {  
  628.         if (env->ExceptionCheck() == JNI_TRUE || jstr == NULL)  
  629.         {  
  630.             env->ExceptionDescribe();  
  631.             env->ExceptionClear();  
  632.             printf("jstringToNative函数转换时,传入的参数str为空");  
  633.             return NULL;  
  634.         }  
  635.           
  636.         jbyteArray bytes = 0;   
  637.         jthrowable exc;   
  638.         char *result = 0;   
  639.         if (env->EnsureLocalCapacity(2) < 0) {   
  640.             return 0; /* out of memory error */   
  641.         }   
  642.         jclass jcls_str = env->FindClass("java/lang/String");   
  643.         jmethodID MID_String_getBytes = env->GetMethodID(jcls_str, "getBytes""()[B");  
  644.           
  645.         bytes = (jbyteArray)env->CallObjectMethod(jstr, MID_String_getBytes);   
  646.         exc = env->ExceptionOccurred();   
  647.         if (!exc) {   
  648.             jint len = env->GetArrayLength( bytes);   
  649.             result = (char *)malloc(len + 1);   
  650.             if (result == 0) {   
  651.                 //  这个好像是要在Linux 平台下才有的函数,  
  652.                 //  window 报错:error C2065: 'JNU_ThrowByName' : undeclared identifier  
  653.         //      JNU_ThrowByName(env, "java/lang/OutOfMemoryError", 0);     
  654.                 env->DeleteLocalRef(bytes);   
  655.                 return 0;   
  656.             }   
  657.             env->GetByteArrayRegion(bytes, 0, len, (jbyte *)result);   
  658.             result[len] = 0; /* NULL-terminate */   
  659.         } else {   
  660.             env->DeleteLocalRef(exc);   
  661.         }   
  662.         env->DeleteLocalRef(bytes);   
  663.         return (char*)result;  
  664.     }  
  665.   
  666. }  
  667.   
  668.    
  669. #endif  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多