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

//

/*

ASCII 英文一个字节

gb2312,gbk 中文两个字节,英文一个字节

在中文系统中ansi一般指gb2312或gbk

GB2312、GBK都属于双字节字符集 (DBCS)

Utf-8 中文三个字节,英文一个字节

Unicode 中文两个字节,英文两个字

*/

//

//

/*

GB2312 中国国家 标准码

ANSI码(American National Standards Institute)

美国国家  标准学会 的 标准码

ASCII码(America Standard Code for Information Interchange)美国信息交换标准码

你可以认为是不同的东西!

ANSI码仅在前126个与ASCII码相同

*/

//

//

/*

/*

*   二进制、八进制、十进制、十六进制转换   16进制和字符相互转换

*/

//

//

/*

java内部是使用16bit的unicode编码(UTF-16)来表示字符串的,无论中文英文都是2字节;

jni内部是使用UTF-8编码来表示字符串的,UTF-8是变长编码的unicode,一般ascii字符是1字节,中文是3字节;

c/c++使用的是原始数据,ascii就是一个字节了,中文一般是GB2312编码,用两个字节来表示一个汉字。

*/

//

//

//   CodeConver.h

//

#ifndef CodeConver_H

#define CodeConver_H

namespaceCodeConvert

{

#include 

#include 

#include 

#include 

#include 

#include 

//   ANSI To Unicode

//   测试通过

wchar_t* ANSIToUnicode(constchar* str )

{

inttextlen ;

wchar_t* result;

textlen = MultiByteToWideChar( CP_ACP, 0, str,-1, NULL,0 );

if(textlen ==0)

{

returnNULL;

}

result = (wchar_t*)malloc((textlen+1)*sizeof(wchar_t));

memset(result,0,(textlen+1)*sizeof(wchar_t));

MultiByteToWideChar(CP_ACP, 0,str,-1,(LPWSTR)result,textlen );

returnresult;

}

/************************************************************************/

//  Unicode  To ANSI(美国国家标准码)

//  测试通过

//  [2/8/2012 liu]

/************************************************************************/

char* UnicodeToANSI(constwchar_t* str )

{

char* result;

inttextlen;

textlen = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL );

if(textlen ==0)

{

returnNULL;

}

result =(char*)malloc((textlen+1)*sizeof(char));

memset( result, 0, sizeof(char) * ( textlen + 1 ) );

WideCharToMultiByte( CP_ACP, 0, str, -1, result, textlen, NULL, NULL );

returnresult;

}

/************************************************************************/

//  UTF8 To Unicode

//  [2/8/2012 liu]

//  测试通过

/************************************************************************/

intUTF8ToUnicode(wchar_t* &result,constchar* utf8 )

{

inttextlen ;

textlen = MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)utf8,-1, NULL,0 );

if(textlen == 0)

{

returnNULL;

}

result = (wchar_t*)malloc((textlen+1)*sizeof(wchar_t));

memset(result,0,textlen * 2 + 2);

intwidelen = MultiByteToWideChar(CP_UTF8, 0,(LPCSTR)utf8,-1,(LPWSTR)result,textlen );

returnwidelen-1;

}

/************************************************************************/

//  UnicodeToUTF8

//  ????????

//  [2/8/2012 liu]

/************************************************************************/

char* UnicodeToUTF8(constwchar_t* str )

{

char* result;

inttextlen;

textlen = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL );

if(textlen == 0)

{

returnNULL;

}

result =(char*)malloc((textlen+1)*sizeof(char));

memset(result, 0, sizeof(char) * ( textlen + 1 ) );

WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL );

returnresult;

}

/************************************************************************/

//  宽字符 转换为 多字符  Unicode - ANSI

//  ????????

//  [2/8/2012 liu]

/************************************************************************/

char* w2m(constwchar_t* wcs)

{

intlen;

char* buf;

if(wcs =NULL)

{

returnNULL;

}

len =wcstombs(NULL,wcs,0);

if(len == 0)

returnNULL;

buf = (char*)malloc(sizeof(char)*(len+1));

memset(buf, 0, sizeof(char) *(len+1));

len =wcstombs(buf,wcs,len+1);

returnbuf;

}

/************************************************************************/

//  多字符 转换为 宽字符  ANSI - Unicode

//

//  [2/8/2012 liu]

/************************************************************************/

wchar_t* multiByte_to_wideChar(constchar* mbs)

{

intlen;

wchar_t* buf;

if(mbs == NULL)

{

returnNULL;

}

len =mbstowcs(NULL,mbs,0);

if(len == 0)

returnNULL;

buf = (wchar_t*)malloc(sizeof(wchar_t)*(len+1));

memset(buf, 0, sizeof(wchar_t) *(len+1));

len =mbstowcs(buf,mbs,len+1);

returnbuf;

}

/************************************************************************/

//  ANSI To UTF8

//  ??????

//  [2/8/2012 liu]

/************************************************************************/

char* ANSIToUTF8(constchar* str)

{

returnUnicodeToUTF8(ANSIToUnicode(str));

}

/************************************************************************/

//  UTF8 To ANSI

//  测试通过

//  [2/8/2012 liu]

/************************************************************************/

char* UTF8ToANSI(constchar* str)

{

wchar_t* temp;

if(str == NULL)

{

returnNULL;

}

UTF8ToUnicode(temp,str);

returnUnicodeToANSI(temp);

}

//  测试OK

//  UTF8  convert to GB2312

voidUTF8ToGB2312(constchar*  utf8,char* &gb2312 )

{

intnLen = MultiByteToWideChar( CP_UTF8, 0, utf8, -1, NULL, 0 );

if(nLen == 0)

{

gb2312 = NULL;

return;

}

USHORT* pwszGB2312 =newUSHORT[ nLen + 1 ];

RtlZeroMemory( pwszGB2312, nLen * 2 + 2 );

MultiByteToWideChar( CP_UTF8, 0, utf8, -1, pwszGB2312, nLen );

nLen = WideCharToMultiByte( CP_ACP, 0, pwszGB2312, -1, NULL, 0, NULL, NULL );

CHAR* pszGB2312 =newCHAR[ nLen + 1 ];

RtlZeroMemory( pszGB2312, nLen + 1 );

WideCharToMultiByte( CP_ACP, 0, pwszGB2312, -1, pszGB2312, nLen, NULL, NULL );

gb2312 = pszGB2312;

//      delete [] pszGB2312;

//      delete [] pwszGB2312;

}

// GB2312 convert to UTF8

//  测试通过

intGB2312ToUTF8(constchar* gb2312,char* &utf8 )

{

intnLen1 = MultiByteToWideChar( CP_ACP, 0, gb2312, -1, NULL, 0 );

if(nLen1 == 0)

{

return0;

}

USHORT* pwszUTF8 =newUSHORT[ nLen1 + 1 ];

RtlZeroMemory( pwszUTF8, nLen1 * 2 + 2 );

MultiByteToWideChar( CP_ACP, 0, gb2312, -1, pwszUTF8, nLen1 );

intnLen = WideCharToMultiByte( CP_UTF8, 0, pwszUTF8, -1, NULL, 0, NULL, NULL );

CHAR* pszUTF8 =newCHAR[ nLen + 1 ];

RtlZeroMemory( pszUTF8, nLen + 1 );

WideCharToMultiByte( CP_UTF8, 0, pwszUTF8, -1, pszUTF8, nLen, NULL, NULL );

utf8 = pszUTF8;

returnnLen1-1;

//  delete [] pszUTF8;

//  delete [] pwszUTF8;

}

//  Gb2312 To Unicode

//  测试通过

intGb2312ToUnicode(wchar_t* &OutUnicode,constchar*gb2312)

{

char* utf8 = NULL;

if(gb2312==NULL)

{

OutUnicode = NULL;

return0;

}

GB2312ToUTF8(gb2312,utf8);

intlen = UTF8ToUnicode(OutUnicode,utf8);

returnlen;

}

//

//

/**************************************************************************

*

*  函数名:  HexToString

*

*  描  述:  16进制 转为 字符串

*

*  参  数:  IN:const char *pHex,IN:unsigned long hexLen,

*           OUT:char *pByteString

*

*  返  回:  成功:0 ,   失败:1、2

*

*  作  者: liuguanglin

*

**************************************************************************/

DWORDHexToString(/*IN*/constchar* pHex,

/*IN*/DWORDhexLen,

/*OUT*/char* pByteString)

{

unsigned longi;

if(pHex==NULL)

return1;

if(hexLen <= 0)

return2;

for(i=0;i

{

if(((pHex[i]&0xf0)>>4)>=0 && ((pHex[i]&0xf0)>>4)<=9)

pByteString[2*i]=((pHex[i]&0xf0)>>4)+0x30;

elseif(((pHex[i]&0xf0)>>4)>=10 && ((pHex[i]&0xf0)>>4)<=16)

pByteString[2*i]=((pHex[i]&0xf0)>>4)+0x37;   //  小写:0x37 改为 0x57

if((pHex[i]&0x0f)>=0 && (pHex[i]&0x0f)<=9)

pByteString[2*i+1]=(pHex[i]&0x0f)+0x30;

elseif((pHex[i]&0x0f)>=10 && (pHex[i]&0x0f)<=16)

pByteString[2*i+1]=(pHex[i]&0x0f)+0x37;      //  小写:0x37 改为 0x57

}

return0;

}

/**************************************************************************

*

*  函数名:  StringToHex

*

*  描  述:  字符串 转为 16进制

*

*  参  数:  IN:const char *pHexBYTE,IN:DWORD dwStrLen,OUT:BYTE *pbHex

*

*  返  回:  成功:0 ,   失败:1、2

*

*  作  者: liuguanglin

*

**************************************************************************/

DWORDStringToHex(/*IN*/constBYTE* pByteString,

/*IN */DWORDdwStrLen,

/*OUT*/BYTE* pbHex)

{

DWORDi;

DWORDdwRet;

unsigned char* pTempBuf=NULL;

if(pByteString==NULL || pbHex==NULL)

return1;

if(dwStrLen <= 0)

return2;

if((dwStrLen%2)!=0)

{

pTempBuf=(BYTE*)malloc(dwStrLen+2);

pTempBuf[0]=0x30;

memcpy(&pTempBuf[1],pByteString,sizeof(BYTE)*dwStrLen);

dwRet=StringToHex(pTempBuf,dwStrLen+1,pbHex);

free(pTempBuf);

returndwRet;

}

else

{

for(i=0;i

{

if(i%2==0)

{

if(pByteString[i]>='0'&& pByteString[i]<='9')

pbHex[i/2]=(pByteString[i]-0x30)<<4;

elseif(pByteString[i]>='a'&& pByteString[i]<='f')

pbHex[i/2]=(pByteString[i]-0x57)<<4;

elseif(pByteString[i]>='A'&& pByteString[i]<='F')

pbHex[i/2]=(pByteString[i]-0x37)<<4;

else

return3;

}

else

{

if(pByteString[i]>='0'&& pByteString[i]<='9')

pbHex[i/2]|=pByteString[i]-0x30;

elseif(pByteString[i]>='a'&& pByteString[i]<='f')

pbHex[i/2]|=pByteString[i]-0x57;

elseif(pByteString[i]>='A'&& pByteString[i]<='F')

pbHex[i/2]|=pByteString[i]-0x37;

else

return4;

}

}

}

return0;

}

/*****************************************

HEX 到 ASCII 的转换函数

入口参数: data: 转换数据的入口指针

buffer: 转换后数据入口指针

len : 需要转换的长度

返回参数:转换后数据长度

*******************************************/

inthex_2_ascii(char*data,char*buffer,intlen)

{

constcharascTable[17] = {"0123456789ABCDEF"};

char*tmp_p = buffer;

inti, pos;

pos = 0;

for(i = 0; i 

{

tmp_p[pos++] = ascTable[data[i]>>4&0x0f];

tmp_p[pos++] = ascTable[data[i] & 0x0f];

}

tmp_p[pos] = '\0';

returnpos;

}

/*****************************************

ASCII 到 HEX 的转换函数

入口参数: O_data: 转换数据的入口指针,

N_data: 转换后新数据的入口指针

len : 需要转换的长度

返回参数:-1: 转换失败

其它:转换后数据长度

注意:O_data[]数组中的数据在转换过程中会被修改。

****************************************/

intascii_2_hex(char*O_data,char*N_data,intlen)

{

inti,j,tmp_len;

chartmpData;

for(i = 0; i 

{

if((O_data[i] >='0') && (O_data[i] <='9'))

{

tmpData = O_data[i] - '0';

}

elseif((O_data[i] >='A') && (O_data[i] <='F'))//A....F

{

tmpData = O_data[i] - 0x37;

}

elseif((O_data[i] >='a') && (O_data[i] <='f'))//a....f

{

tmpData = O_data[i] - 0x57;

}

else{

return-1;

}

O_data[i] = tmpData;

}

for(tmp_len = 0,j = 0; j 

{

N_data[tmp_len++] = (O_data[j]<<4) | O_data[j+1];

}

returntmp_len;

}

/**************************************************************************

*

*  函数名:  Soft_swap

*

*  描  述:  RSA密钥 倒序

*

*  参  数:  IN: void *dst, IN: const void *src, IN: size_t count

*

*  返  回:  无

*

*  作  者: liuguanglin

**************************************************************************/

voidSoft_swap(void*dst,constvoid*src,size_tcount)

{

inti;

unsigned char*t;

unsigned char*q = (unsignedchar*)dst;

unsigned char*p = (unsignedchar*) src;

t = q;

if(t == p)

{

q = (unsigned char*)malloc(count);

assert(q);

}

for( i=0; (size_t) i

if(t == p) {

memcpy(p, q, count);

free(q);

}

}

//  编码转换  

 UTF8 convert to GB2312

VOIDUTF82GB2312(/*IN*/constchar* utf8,/* OUT */constchar* gb2312 )

{

intnLen = MultiByteToWideChar( CP_UTF8, 0, utf8 , -1, NULL, 0 );

USHORT* pwszGB2312 =newUSHORT[ nLen + 1 ];

RtlZeroMemory( pwszGB2312, nLen * 2 + 2 );

MultiByteToWideChar( CP_UTF8, 0, utf8 , -1, pwszGB2312, nLen );

nLen = WideCharToMultiByte( CP_ACP, 0, pwszGB2312, -1, NULL, 0, NULL, NULL );

CHAR* pszGB2312 =newCHAR[ nLen + 1 ];

RtlZeroMemory( pszGB2312, nLen + 1 );

WideCharToMultiByte( CP_ACP, 0, pwszGB2312, -1, pszGB2312, nLen, NULL, NULL );

gb2312 = pszGB2312;

delete[] pszGB2312;

delete[] pwszGB2312;

}

 GB2312 convert to UTF8

VOIDGB23122UTF8(/*IN*/constchar* gb2312,/* OUT */constchar* utf8 )

{

intnLen = MultiByteToWideChar( CP_ACP, 0, gb2312 , -1, NULL, 0 );

USHORT* pwszUTF8 =newUSHORT[ nLen + 1 ];

RtlZeroMemory( pwszUTF8, nLen * 2 + 2 );

MultiByteToWideChar( CP_ACP, 0, gb2312 , -1, pwszUTF8, nLen );

nLen = WideCharToMultiByte( CP_UTF8, 0, pwszUTF8, -1, NULL, 0, NULL, NULL );

CHAR* pszUTF8 =newCHAR[ nLen + 1 ];

RtlZeroMemory( pszUTF8, nLen + 1 );

WideCharToMultiByte( CP_UTF8, 0, pwszUTF8, -1, pszUTF8, nLen, NULL, NULL );

utf8 = pszUTF8;

delete[] pszUTF8;

delete[] pwszUTF8;

}

//-----------------------------------------------  JNI 部分  ---------------------------------------

/*

java内部是使用16bit的unicode编码(UTF-16)来表示字符串的,无论中文英文都是2字节;

jni内部是使用UTF-8编码来表示字符串的,UTF-8是变长编码的unicode,一般ascii字符是1字节,中文是3字节;

c/c++使用的是原始数据,ascii就是一个字节了,中文一般是GB2312编码,用两个字节来表示一个汉字。

*/

//  测试Ok

// 只适用于 window平台

char* jstringToWindows( JNIEnv *env, jstring jstr )

{ // unicode(UTF-16) 转换成 GB2312

intlength = (env)->GetStringLength(jstr );

constjchar* jcstr = (env)->GetStringChars(jstr, 0 );

char* rtn = (char*)malloc( length*2+1 );

intsize = 0;

size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );

if( size <= 0 )

returnNULL;

(env)->ReleaseStringChars(jstr, jcstr );

rtn[size] = 0;

returnrtn;

}

//  测试Ok

//  只适用于 window平台

jstring WindowsTojstring( JNIEnv* env,constchar* str )

{   //GB2312转换成 unicode(UTF-16)

jstring rtn = 0;

intslen = strlen(str);

unsigned short* buffer = 0;

if( slen == 0 )

rtn = (env)->NewStringUTF(str );

else

{

intlength = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );

buffer = (unsigned short*)malloc( length*2 + 1 );

if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )

{

rtn = (env)->NewString(  (jchar*)buffer, length );

}

//   rtn = (env)->NewString(  (jchar*)buffer, length );

}

if( buffer )

free( buffer );

returnrtn;

}

/************************************************************************/

//java jni中跨平台(win32或linux,unix)  String转为jstring 。

/************************************************************************/

jstring nativeTojstring( JNIEnv* env,constchar* str )

{

jclass strClass = env->FindClass( "Ljava/lang/String;");

jmethodID ctorID = env->GetMethodID( strClass, "",

"([BLjava/lang/String;)V");

if(env->ExceptionCheck() == JNI_TRUE || str == NULL)

{

env->ExceptionDescribe();

env->ExceptionClear();

printf("nativeTojstring函数转换时,str为空/n");

returnNULL;

}

jbyteArray bytes = env->NewByteArray( strlen(str));

//如果str为空则抛出异常给jvm

env->SetByteArrayRegion( bytes, 0,  strlen(str), (jbyte*)str);

jstring encoding = env->NewStringUTF( "GBK");

jstring strRtn = (jstring)env->NewObject( strClass, ctorID, bytes,

encoding);

//释放str内存

// free(str);

returnstrRtn;

}

/************************************************************************/

//java jni中跨平台(win32或linux,unix)  jstring转为String 。

/************************************************************************/

char* jstringToNative(JNIEnv *env, jstring jstr)

{

if(env->ExceptionCheck() == JNI_TRUE || jstr == NULL)

{

env->ExceptionDescribe();

env->ExceptionClear();

printf("jstringToNative函数转换时,传入的参数str为空");

returnNULL;

}

jbyteArray bytes = 0;

jthrowable exc;

char*result = 0;

if(env->EnsureLocalCapacity(2) 

return0;/* out of memory error */

}

jclass jcls_str = env->FindClass("java/lang/String");

jmethodID MID_String_getBytes = env->GetMethodID(jcls_str, "getBytes","()[B");

bytes = (jbyteArray)env->CallObjectMethod(jstr, MID_String_getBytes);

exc = env->ExceptionOccurred();

if(!exc) {

jint len = env->GetArrayLength( bytes);

result = (char*)malloc(len + 1);

if(result == 0) {

//  这个好像是要在Linux 平台下才有的函数,

//  window 报错:error C2065: 'JNU_ThrowByName' : undeclared identifier

//      JNU_ThrowByName(env, "java/lang/OutOfMemoryError", 0);

env->DeleteLocalRef(bytes);

return0;

}

env->GetByteArrayRegion(bytes, 0, len, (jbyte *)result);

result[len] = 0; /* NULL-terminate */

} else{

env->DeleteLocalRef(exc);

}

env->DeleteLocalRef(bytes);

return(char*)result;

}

}

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,JNI 接口允许您在 Java 代码和本地代码之间传递对象。在 JNI 中,Java 对象被表示为 jobject 类型,本地代码中需要使用 JNIEnv 指针来访问 Java 对象。要转换对象类型,您可以使用以下 JNI 函数: 1. **IsInstanceOf**:检查对象是否是指定类的实例。该函数的原型如下: ```c jboolean IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz); ``` 其中,env 是指向 JNIEnv 的指针,obj 是要检查的对象,clazz 是要检查的类。 示例代码: ```c jclass integerClass = (*env)->FindClass(env, "java/lang/Integer"); jboolean isInteger = (*env)->IsInstanceOf(env, obj, integerClass); ``` 2. **NewObject**:创建一个新的 Java 对象。该函数的原型如下: ```c jobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...); ``` 其中,env 是指向 JNIEnv 的指针,clazz 是要创建对象的类,methodID 是要调用的构造函数的方法 ID,后面的参数是传递给构造函数的参数列表。 示例代码: ```c jclass integerClass = (*env)->FindClass(env, "java/lang/Integer"); jmethodID constructor = (*env)->GetMethodID(env, integerClass, "<init>", "(I)V"); jobject newInteger = (*env)->NewObject(env, integerClass, constructor, 42); ``` 3. **CallObjectMethod**:调用 Java 对象的实例方法。该函数的原型如下: ```c jobject CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...); ``` 其中,env 是指向 JNIEnv 的指针,obj 是要调用方法的对象,methodID 是要调用的方法的方法 ID,后面的参数是传递给方法的参数列表。 示例代码: ```c jclass stringClass = (*env)->FindClass(env, "java/lang/String"); jmethodID toLowerCase = (*env)->GetMethodID(env, stringClass, "toLowerCase", "()Ljava/lang/String;"); jobject lowerCaseString = (*env)->CallObjectMethod(env, obj, toLowerCase); ``` 以上是一些常用的 JNI 函数,可以帮助您在 Java 和本地代码之间传递对象,并转换对象类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值