大家好!
我现在有一个IC卡,需要往IC卡中写入中文人名,而写入IC卡数据块的接口函数是:
int dc_write(int icdev,unsingned char _Adr,unsigned char *_Data);
_Data:要写入的数据
一次可写入16字节数据。
请问:
1、用什么办法把汉字写进_Data;
2、写入_Data后,读取卡片得到_Data时,如何转化为汉字。

解决方案 »

  1.   

    感觉你的概念没有清楚;啥叫"转化为汉字";汉字在设备中通常都是编码,通过某种字体显示成汉字的模样;汉字的编码有很多种的。常见的是 GBK/GB2312/Unicode/UTF8 这几种;
      

  2.   

    char* str;
    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="张华";对汉字编码知识实在一窍不通,瞎试出来的。
      

  3.   

    就用Unicode表示汉字,然后Unicode转换成char通过接口
      

  4.   

    任务第一,先把任务完成了,回头再看看Unicode等汉字编码问题。
      

  5.   

    先把汉字转成Unicode码存到data里,一个汉字转成Unicode后是两个字节,取出来的时候再转回汉字,偶也是卡片打交道的,祝成功int CEnCodeDlg::GbkToUnicode(const char *pSrc, char *pDst, int pSrcLen)
    {
    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;
    }
      

  6.   

    int CEnCodeDlg::GbkToUnicode(const char *pSrc, char *pDst, int pSrcLen)
    {
    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后,再转成汉字,偶也是和卡片打交道的,祝成功。