C语言,字节,十六进制字符 互转

十六进制的字符 00 53 31 30 --> 字节数组
代码示例:

    int lenth = 0;
    char test_data[4] = {0};
    memcpy(test_data, "\x00\x53\x31\x30", 4);
    lenth = sizeof(test_data);
一个完整demo测试:

头文件:

#include 
#include 
#include 

字节数组 --> 十六进制的字符 的 实现:

static char str_qra[512] = {0};
// phexsrc 要转换的一段字节
// ihexlen 要转换的字节长度
void Hex2Str_qra(const void *phexsrc, int ihexlen)
{
    const char * pbuf = (const char *)phexsrc;
    char ulowbyte, uhighbyte;
    int i,j;
    memset(str_qra, 0, sizeof(str_qra));
    
    // 一个字节,会转换为两位字符,所以字节的长度,不能大于字符串变量的长度的一半
    if (ihexlen >= sizeof(str_qra) / 2)
    {
        return;
    }
    for (i = 0,j = 0; i < ihexlen * 2; i += 2,j += 3)// 字节间不加空格时,j没有意义
    {
    // 此处的字节数据都是默认十进制
        ulowbyte = pbuf[i / 2] & 0x0f; // 取一个字节的低位,如0x53 & 0x0f = 3,得到低位为3,注意不是'3',而是纯数字3
        uhighbyte = pbuf[i / 2] / 16; // 取一个字节的高位,/16会省略余数,如0x53(83/16=5),即得到高位为5,纯数字5

    // char 类型本质也是数字,也可以计算!!
        if (uhighbyte >= 10)
        {
        // 例如,高位为10,已知'7'=55,10+'7'=10+55=65,'A'=65
            //str_qra[i] = uhighbyte + '7';// 加空格时,注释掉该行
            str_qra[j] = uhighbyte + '7';// 不加空格时,注释掉该行
        }
        else
        {
            //str_qra[i] = uhighbyte + '0';// 加空格时,注释掉该行
            str_qra[j] = uhighbyte + '0';// 不加空格时,注释掉该行
        }
        if (ulowbyte >= 10)
        {
            //str_qra[i + 1] = ulowbyte + '7';// 加空格时,注释掉该行
            str_qra[j + 1] = ulowbyte + '7';// 不加空格时,注释掉该行
        }
        else
        {
            //str_qra[i + 1] = ulowbyte + '0';// 加空格时,注释掉该行
            str_qra[j + 1] = ulowbyte + '0';// 不加空格时,注释掉该行
        }

    
    str_qra[j + 2] = ' ';// 不加空格时,注释掉该行
    }
    //str_qra[ihexlen * 2] = '\0';// 加空格时,注释掉该行
    str_qra[ihexlen * 3] = '\0';// 不加空格时,注释掉该行
    printf("%s\n",str_qra);
}

调用测试:

int main(int argc, char **argv)
{
    int lenth = 0;
    char test_data[4] = {0};
    memcpy(test_data, "\x00\x53\x31\x30", 4);
    lenth = sizeof(test_data);
    Hex2Str_qra(test_data,lenth);
    return 0;
}

编译运行:

gcc -o hello hex.c
./hello

输出结果:

00 53 31 30

你可能感兴趣的:(C语言,字节,十六进制字符 互转)