十六进制与字符串之间互转

来源:互联网 发布:if you音译歌词知乎 编辑:程序博客网 时间:2024/05/14 04:21

下面是函数:
// 字节数据转换为可打印字符串
// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
// 输入: pSrc - 源数据指针
//       nSrcLength - 源数据长度
// 输出: pDst - 目标字符串指针
// 返回: 目标字符串长度
int bytes2HexStr(unsigned char* pSrc, unsigned char* pDst, int nSrcLength)
{
const char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表

for (int i = 0; i < nSrcLength; i++){

*pDst++ = tab[*pSrc >> 4]; // 输出高4位
*pDst++ = tab[*pSrc & 0x0f]; // 输出低4位
pSrc++;
}

// 输出字符串加个结束符
*pDst = '\0';

// 返回目标字符串长度
return (nSrcLength * 2);
}

// 可打印字符串转换为字节数据
// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// 输入: pSrc - 源字符串指针
//       nSrcLength - 源字符串长度
// 输出: pDst - 目标数据指针
// 返回: 目标数据长度
int hexStr2Bytes(unsigned char* pSrc,unsigned  char* pDst, int nSrcLength)
{
for (int i = 0; i < nSrcLength; i += 2)
{
// 输出高4位
if ((*pSrc >= '0') && (*pSrc <= '9')){
*pDst = (*pSrc - '0') << 4;
}
else{
*pDst = (*pSrc - 'A' + 10) << 4;
}

pSrc++;

// 输出低4位
if ((*pSrc>='0') && (*pSrc<='9')){
*pDst |= *pSrc - '0';
}
else{
*pDst |= *pSrc - 'A' + 10;
}
pSrc++;
pDst++;
}

// 返回目标数据长度
return (nSrcLength / 2);
}


使用:
unsigned char src[255] = {0x1A,0x0,0x22,0x89,0xff,0xee,0xbc};

unsigned char dst[255] = {0};
int szLength = 0;
int byLength = 0;

//to hexstr
byLength = bytes2HexStr(src,dst,7);
printf("dst: %s\n", dst);

//hexstr 2 str
szLength = hexStr2Bytes(dst,src,strlen((const char *)dst));
for(int i=0; i<szLength; i++){
printf("x, ",src[i]);
}
0 0
原创粉丝点击