大家好!
我现在有一个IC卡,需要往IC卡中写入中文人名,而写入IC卡数据块的接口函数是:
int dc_write(int icdev,unsingned char _Adr,unsigned char *_Data);
_Data:要写入的数据
一次可写入16字节数据。
请问:
1、用什么办法把汉字写进_Data;
2、写入_Data后,读取卡片得到_Data时,如何转化为汉字。
我现在有一个IC卡,需要往IC卡中写入中文人名,而写入IC卡数据块的接口函数是:
int dc_write(int icdev,unsingned char _Adr,unsigned char *_Data);
_Data:要写入的数据
一次可写入16字节数据。
请问:
1、用什么办法把汉字写进_Data;
2、写入_Data后,读取卡片得到_Data时,如何转化为汉字。
char* name;
unsigned char Data[16];
name=new char[4];
str="张华";
int len;
len=strlen(str);
for(int i=0;i<16;i++)
{
Data[i]=0;
}
for(i=0;i<4;i++)
{
Data[i]=str[i];
}
for(i=0;i<4;i++)
{
name[i]=Data[i];
}
delete[] name;
结果name="张华";对汉字编码知识实在一窍不通,瞎试出来的。
{
int wcharLen = 0;
unsigned short wchar[512];
char schar[10];
wcharLen = ::MultiByteToWideChar(CP_ACP, 0, pSrc, pSrcLen, (LPWSTR)(LPCTSTR)wchar, 512);
for (int i = 0; i < wcharLen; i++)
{
sprintf_s(schar,"%02X%02X", wchar[i]>>8, wchar[i]&0xff);
strcat(pDst,schar);
}
::AfxMessageBox ((CString)pDst);
return wcharLen * 2;
}unsigned int CEnCodeDlg::HexToDec(char *hex)
{
unsigned int n=0;
for (char *tmp=hex; ; tmp++)
{
if (*tmp>='0' && *tmp <='9' )
n = n*16 + *tmp-'0';
else if (*tmp>='A' && *tmp <='Z')
n = n*16 + *tmp-55;
else if (*tmp>='a' && *tmp <='z')
n = n*16 + *tmp-87;
else
break;
}
return n;
}
int CEnCodeDlg::UnicodeToGbk(char *pSrc, char *pDst, int pSrcLen)
{
int nwcharLen = 0;
unsigned short wchar[512];
char hex[10];
unsigned int rst;
for (int i = 0; i < pSrcLen/4; i++)
{
sprintf_s(hex,"%c%c",pSrc[i*4+0],pSrc[i*4+1]);
rst = HexToDec(hex);
wchar[i] = rst << 8;
sprintf_s(hex,"%c%c",pSrc[i*4+2],pSrc[i*4+3]);
rst = HexToDec(hex);
wchar[i]|= rst;
}
nwcharLen = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wchar, pSrcLen/4, pDst, 512, NULL, NULL);
::AfxMessageBox ((CString)pDst);
return nwcharLen;
}
{
int wcharLen = 0;
unsigned short wchar[512];
char schar[10];
wcharLen = ::MultiByteToWideChar(CP_ACP, 0, pSrc, pSrcLen, (LPWSTR)(LPCTSTR)wchar, 512);
for (int i = 0; i < wcharLen; i++)
{
sprintf_s(schar,"%02X%02X", wchar[i]>>8, wchar[i]&0xff);
strcat(pDst,schar);
}
::AfxMessageBox ((CString)pDst);
return wcharLen * 2;
}unsigned int CEnCodeDlg::HexToDec(char *hex)
{
unsigned int n=0;
for (char *tmp=hex; ; tmp++)
{
if (*tmp>='0' && *tmp <='9' )
n = n*16 + *tmp-'0';
else if (*tmp>='A' && *tmp <='Z')
n = n*16 + *tmp-55;
else if (*tmp>='a' && *tmp <='z')
n = n*16 + *tmp-87;
else
break;
}
return n;
}
int CEnCodeDlg::UnicodeToGbk(char *pSrc, char *pDst, int pSrcLen)
{
int nwcharLen = 0;
unsigned short wchar[512];
char hex[10];
unsigned int rst;
for (int i = 0; i < pSrcLen/4; i++)
{
sprintf_s(hex,"%c%c",pSrc[i*4+0],pSrc[i*4+1]);
rst = HexToDec(hex);
wchar[i] = rst << 8;
sprintf_s(hex,"%c%c",pSrc[i*4+2],pSrc[i*4+3]);
rst = HexToDec(hex);
wchar[i]|= rst;
}
nwcharLen = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wchar, pSrcLen/4, pDst, 512, NULL, NULL);
::AfxMessageBox ((CString)pDst);
return nwcharLen;
}先把汉字转成Unicode,占两个字节,写到卡里,读出data后,再转成汉字,偶也是和卡片打交道的,祝成功。