关于快速将16进制转为字符串的问题,高手请进!

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

转换为"0xABF1D322........98"这样的字符串.

...全文
191 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuitcir 2004-11-10
  • 打赏
  • 举报
回复
又写错了一点东西,修正如下:

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,但应该不碍.
}
cuitcir 2004-11-10
  • 打赏
  • 举报
回复
这个怎样
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,但应该不碍.
}

konista 2004-11-10
  • 打赏
  • 举报
回复
while的效率是低下的,没有for好
roscoe 2004-11-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';
}
Zhymax 2004-11-09
  • 打赏
  • 举报
回复
位操作效率最高:

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;
}
zgzg 2004-11-09
  • 打赏
  • 举报
回复
我就是用FOR,但感觉没有什么效率,所以才求别的方法.
camelyi 2004-11-09
  • 打赏
  • 举报
回复
对了,上面漏了字符串结尾

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';
camelyi 2004-11-09
  • 打赏
  • 举报
回复
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];
}

这个比较好
camelyi 2004-11-09
  • 打赏
  • 举报
回复
CString strResult(_T("0x"));
CString strTemp;
for (int i = 0; i < 800; i++)
{
strTemp.Format(_T("%x"), a[i]);
strResult += strTemp;
}
cuitcir 2004-11-09
  • 打赏
  • 举报
回复
我漏写了一点东西,修正如下
*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';
cuitcir 2004-11-09
  • 打赏
  • 举报
回复
不调用函数,直接转换,应该快很多,如下面

*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';

zgzg 2004-11-09
  • 打赏
  • 举报
回复

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧