现在我要将一个char a[800]的数组中的数据转换为连续的以0x开始的字符串请问有什么最快的方法.
如:
a[0]=0xAB
a[1]=0xF1
a[2]=0xD3
a[3]=0x22
.
.
.
a[799]=0x98转换为"0xABF1D322........98"这样的字符串.

解决方案 »

  1.   

    CString strResult(_T("0x"));
    CString strTemp;
    for (int i = 0; i < 800; i++)
    {
        strTemp.Format(_T("%x"), a[i]);
        strResult += strTemp;
    }
      

  2.   

    char szResult[800 * 2 + 2] = {'0', 'x'};
    char szTemp[2];
    for (int i = 0; i < 800; i++)
    {
        sprintf(szTemp, "%x", a[i]);
        szResult[2 + i * 2] = szTemp[0];
        szResult[2 + i * 2 + 1] = szTemp[1];
    }这个比较好
      

  3.   

    对了,上面漏了字符串结尾char szResult[800 * 2 + 2 + 1] = {'0', 'x'};
    char szTemp[2 + 1];
    for (int i = 0; i < 800; i++)
    {
        sprintf(szTemp, "%x", a[i]);
        szResult[2 + i * 2] = szTemp[0];
        szResult[2 + i * 2 + 1] = szTemp[1];
    }szResult[800 * 2 + 2] = '\0';
      

  4.   

    我就是用FOR,但感觉没有什么效率,所以才求别的方法.
      

  5.   

    不调用函数,直接转换,应该快很多,如下面*pDectByteArray++='0';
    *pDectByteArray++='x';
    for(int i=0;i<800;i++)
      {
       if(( Temp=*pSourceByteArray/16 ) < 10) *pDectByteArray=Temp+0x30;
       else *pDectByteArray++ = Temp - 0x0a + 'A';   if(( Temp=*pSourceByteArray%16 ) < 10) *pDectByteArray=Temp+0x30;
       else *pDectByteArray++ = Temp - 0x0a + 'A';
       pSourceByteArray++; 
      }
    *pDectByteArray = '\0';
      

  6.   

    我漏写了一点东西,修正如下
    *pDectByteArray++='0';
    *pDectByteArray++='x';
    for(int i=0;i<800;i++)
      {
       if(( Temp=*pSourceByteArray/16 ) < 10) *pDectByteArray++=Temp+0x30;
       else *pDectByteArray++ = Temp - 0x0a + 'A';   if(( Temp=*pSourceByteArray%16 ) < 10) *pDectByteArray++=Temp+0x30;
       else *pDectByteArray++ = Temp - 0x0a + 'A';
       pSourceByteArray++; 
      }
    *pDectByteArray = '\0';
      

  7.   

    位操作效率最高:char hex[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    BYTE h;
    for (int i=0; i<800; i++) {
      h = hex[(BYTE)a[i] >> 4];     
      cout << h;
      h = hex[(BYTE)a[i] & 0xf];
      cout << h;
    }
      

  8.   

    这个怎样
    const unsigned short FindTable[256] = {0x3030,0x3130,0x3230,0x3330,0x3430........0XFEFF,0xFFFF};
    //这里省略掉,共256个.注意要转换的字节低位对应高8位,高位对应低8位,如0x01就对应0x3130,这样取出才可正确存放数组中.还有,这个表要建起也挺劲,最好编程序然后打出来.void Convert(unsigned short *pDect,unsigned char *pSource,int nLength)
    {
    for (int i=0; i<nLength; i++) 
      *pDect++ = FindTable[*pSource++];
    *pDect=0x0000;//虽然最后放多了一个0x00,但应该不碍.
    }
      

  9.   

    又写错了一点东西,修正如下:const unsigned short FindTable[256] = {0x3030,0x3130,0x3230,0x3330,0x3430........0x4645,0x4646};//修正这里
    //这里省略掉,共256个.注意要转换的字节低位对应高8位,高位对应低8位,如0x01就对应0x3130,这样取出才可正确存放数组中.还有,这个表要建起也挺劲,最好编程序然后打出来.void Convert(unsigned short *pDect,unsigned char *pSource,int nLength)
    {
    for (int i=0; i<nLength; i++) 
      *pDect++ = FindTable[*pSource++];
    *pDect=0x0000;//虽然最后放多了一个0x00,但应该不碍.
    }
      

  10.   

    如果还要快的话,只有用多媒体汇编指令来做并行处理了,不过有必要吗?void FormatHexStr( char* pOut, const char* src , size_t arrSize )
    {
        static char hex[]="0123456789ABCDEF\0\0";
        static unsigned char h,l;    *pOut++ = '0';
        *pOut++ = 'x';

        while( arrSize-- )
        {
            l = (unsigned char)*src & 0x0F;
            h = (unsigned char)*src++;
            *pOut++ = hex[h>>4];
            *pOut++ = hex[l];
        }
        *pOut++ = '0';
        *pOut++ = '0';
        *pOut++ = '\0';
    }
      

  11.   

    while的效率是低下的,没有for好