如何将char字符串转换为十六进制值

时间:2017-09-19 10:57:16

标签: c

我有一种情况,我在USB Tx模式下逐字节地接收字符。 现在我被困在我收到7a的位置,我的目标是创建0x7a数据。

请给我一些解决方法。

void converttohex(int recsize) {

    BYTE ccount = 0;
    //BYTE *recptr = (BYTE*)calloc(CommOP_Rx.bDataLength, sizeof(BYTE));
    *recptr = 88;
    *(recptr + 1) = 16;
    *(recptr + 2) = 1;
    *(recptr + 3) = 224;
    *(recptr + 4) = 1;

    for (xp = 12, s = 5; xp < (CommOP_Rx.bDataLength - 4); xp++,s++) {
        if (xp == 12) {
            for (xp = 12; (*(recimage + xp)) != ','; xp++)
                ccount++;
            if (ccount == 1) {
                xp = 12;
                xq = (*(recimage + xp) - 48);
                *(recptr+s) = xq;
                xp++;
            } else
            if (ccount == 2) {
                xp = 12;
                xq = (*(recimage + xp) - 48) * 10;
                xw = (*(recimage + (++xp)) - 48);
                *(recptr + s) = xq + xw;
                xp++;
            } else
            if (ccount == 3) {
                xp = 12;
                xq = (*(recimage + xp) - 48) * 100;
                xw = (*(recimage + (++xp)) - 48) * 10;
                xe = (*(recimage + (++xp)) - 48);
                *(recptr+s) = xq + xw + xe;
                xp++;
            }
        }
        xp++;
        if (((*(recimage + xp)) == 'a') || ((*(recimage + (++xp))) == 'a')) {
            --xp;
            if (((*(recimage + xp)) == 'a')) {
                xq = (*(recimage + xp) - 48) * 10;
            } else
                xq = (*(recimage + xp) - 48);
            xw = 'a';
            *(recptr + s) = xq  +xw;
        }
        xq = (*(recimage + xp) - 48) * 10;
        xw = (*(recimage + (++xp)) - 48);
        *(recptr + s) = xq + xw;
    }
    for (xp = 0; xp < (CommOP_Rx.bDataLength - 4); xp++) {
        *(recimage + xp)  = *(recptr + xp);
    }

基本上我在这里采样一些数据,这是十六进制的图像数组,并将其存储在我的MCU阵列中。但是在这里我已经实现了当我将收到一个两个连续的数据,其中是一个整数0-9,然后我减去48进入它,因为所有字节都是字符编码,直到这个它工作正常,但收到后十六进制的AF,假设我已收到'7'和'a',它必须是值= 0x7a,因此我需要这个转换帮助!!

3 个答案:

答案 0 :(得分:0)

您可以将十六进制数字存储在char数组中,null将此数组终止,使用sscanf()strtol()将字符串转换为数字。

答案 1 :(得分:0)

将其存储在以null结尾的字符串中并从中读取。

// Assume N is a big number
char str[N] = "7A";
int ret;
sscanf(str, "%x", &ret);
printf("%d", ret); // Output: 122

要重复这样做,让程序构造这个数组:

int i = 0;
while (read_data(&ch)){
    // Assume ch is in "0123456789ABCDEFabcdef"
    str[i++] = ch;
}
str[i] = 0;
// Now parse it
int ret;
sscanf(str, "%x", &ret);

答案 2 :(得分:0)

您的代码对我来说似乎很复杂。只是简单介绍一下可以根据您的问题获取十六进制值而不是基于您的代码。对不起。

如果您将两个输入处理为字符串,则以下方法将适用。

char num1[] = "7";
char num2[] = "a";
char num[10];
strcpy (num, num1);
strcat (num, num2);

现在num将7a作为十六进制字符串

如果你有两个输入作为整数,那么这个逻辑将起作用

int num1,num2,num3;
num1=0x7;
num2=0xa;
num3=(num1<<4)|(num2);
sprintf(str,"0x%x",num3);