1

我有 charbyte[0] = '1' (H'0x31)byte[1] = 'C'(H'0x43)

我正在使用一个缓冲区来获得更多缓冲区char hex_buff[0]。我想在其中包含十六进制内容hex_buff[0] = 0x1C(即字节 [0] 和字节 [1] 的组合)

我正在使用下面的代码,但我意识到我的代码仅对十六进制值 0-9 有效

char s_nibble1 = (byte[0]<< 4)& 0xf0;

char s_nibble2 =  byte[1]& 0x0f;

hex_buff[0] = s_nibble1 | s_nibble2;// 这里我想拥有0x1C而不是0x13

4

4 回答 4

2

是什么让你无法使用strtol()

char bytes[] = "1C";
char buff[1];
buff[0] = strtol(bytes, NULL, 16);  /* Sets buff[0] to 0x1c aka 28. */

根据chux的评论添加此内容:strtol()仅对-0终止的字符数组进行操作。OP的问题不一定需要这种情况。

于 2014-09-09T16:22:39.407 回答
1

您试图通过屏蔽字符代码的位来获取半字节,而不是减去实际值。这是行不通的,因为范围是断开的:编码之间[0..9][A-F]编码之间存在间隙,因此屏蔽将失败。

您可以通过添加一个小辅助函数并在代码中使用它两次来解决此问题:

int hexDigit(char c) {
    c = toupper(c); // Allow mixed-case letters
    switch(c) {
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9': return c-'0';
        case 'A':
        case 'B':
        case 'C':
        case 'D':
        case 'E':
        case 'F': return c-'A'+10;
        default: // Report an error
    }
    return -1;
}

现在您可以像这样编写转换代码:

int val = (hexDigit(byte[0]) << 4) | hexDigit(byte[1]);
于 2014-09-09T15:49:13.523 回答
1

一种可能的方法,不依赖于其他字符操作函数:

char hex2byte(char *hs)
{
    char b = 0;
    char nibbles[2];
    int i;

    for (i = 0; i < 2; i++) {
        if ((hs[i] >= '0') && (hs[i] <= '9')) 
            nibbles[i] = hs[i]-'0';
        else if ((hs[i] >= 'A') && (hs[i] <= 'F')) 
            nibbles[i] = (hs[i]-'A')+10;
        else if ((hs[i] >= 'a') && (hs[i] <= 'f')) 
            nibbles[i] = (hs[i]-'a')+10;
        else 
            return 0;
    }

    b = (nibbles[0] << 4) | nibbles[1];
    return b;
}

例如:hex2byte("a1")返回字节0xa1

在您的情况下,您应该将该函数称为:hex_buff[0] = hex2byte(byte).

于 2014-09-09T15:50:13.160 回答
1

看起来您正在尝试将 ASCII 十六进制转换为内部表示。

有很多方法可以做到这一点,但我最常使用的方法是:

int nibval(unsigned short x)
{
    if  (('0' <= x) && ('9' >= x))
    {
        return  x - '0';
    }
    if  (('a' <= x) && ('f' >= x))
    {
        return  x - ('a' - 10);
    }
    if  (('A' <= x) && ('F' >= x))
    {
        return  x - ('A' - 10);
    }

    //  Invalid input
    return  -1;
}

这使用了一个 unsigned int 参数,因此它适用于单字节字符以及 wchar_t 字符。

于 2014-09-09T15:52:15.487 回答