字节、十六进制字符串相互转换(asc2hex、hex2asc)

本文深入探讨了将十六进制数组转换为ASCII字符数组及反之的操作,详细介绍了实现步骤,并修复了相关bug,对于理解底层数据转换具有重要意义。
//==================================================================
/**    
    功能:        将16进制数组转换成asc字符数组(短转长)
    @param[in]    hex :要转换的十六进制数组
    @param[in]    lenth :转换后的16进制数组的长度
    @param[out]    asc :转换后的asc字符数组(至少分配2倍的hex的大小)
    @par修改记录:
        2015.01.15    马兆瑞    修改asc不为空时出现的bug
**/
//==================================================================
void hex2asc(unsigned char *hex, int hexlength, unsigned char *asc)
{
    for(int i = 0; i < hexlength; i++)
    {
        sprintf((char*)asc+2*i, "%02X", hex[i]);
    }
}

//==================================================================
/**    
    功能:        将asc字符数组转换成16进制数组(长转短),长度不足则末尾自动补F
    @param[in]    asc :要转换的asc字符数组
    @param[in]    lenth :转换后的16进制数组的长度
    @param[out]    hex :转换后的16进制数组
    @par修改记录:
        2015.12.22    马兆瑞
**/
//==================================================================
void asc2hex(unsigned char *asc, int hexlength, unsigned char *hex)
{
    if(strlen((char*)asc) < hexlength*2)
    {
        char *asc_temp = new char[hexlength*2+1];
        memset(asc_temp, 'F', hexlength*2+1);
        memcpy(asc_temp, asc, strlen((char*)asc));
        for(int i = 0; i < hexlength; i++)
        {
            char temp[3] = {asc_temp[i*2], asc_temp[i*2+1]};
            hex[i] = strtol(temp, 0, 16);
        }
        delete []asc_temp;
    }
    else
    {
        for(int i = 0; i < hexlength; i++)
        {            
            char temp[3] = {asc[i*2], asc[i*2+1]};
            hex[i] = strtol(temp, 0, 16);
        }
    }
}

void main()
{
    unsigned char asc[] = "915600000221010021010A68", hex[100] = {0};

    asc2hex(asc, strlen((const char *)asc)/2 , hex);

    unsigned char ascr[512] = {0};
    hex2asc(hex, strlen((const char *)asc)/2 , ascr);
}
 

 

转载于:https://www.cnblogs.com/mzhrd/p/3454613.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值