十六进制到Ascii转换C

时间:2017-07-21 08:30:29

标签: c hex ascii

我的挑战是将十六进制值转换为ascii,输入是一个指向uint8的指针,所以我需要逐字节转换,并且还有一个大小输入(没有字节),输入都是十六进制值,请帮我找到我的代码有什么问题。

输出始终为

uint8 ReferenceNumber[8] = {0x30,0x40,0x60,0x50,0x80,0x60,0x75,0x95};
HexToAscii(&ReferenceNumber[0], output, 8); 

static void HexToAscii(uint8* input, uint8 *output, uint8 size)//No of bytes
{
    uint8 i, temp;

    for(i=1; i<=size; i++)
    {
        temp = (*(input)) >> (4*(i-1));
        temp &= 0x0F;
        temp +='0';
        if (temp >= (10+'0'))
        {
            temp += ('A'-10-'0');
        }
        *(output+size-i) = temp;
    }
}

1 个答案:

答案 0 :(得分:2)

声明

temp = (*(input)) >> (4*(i-1));

可以改写为

uint8 x = *(input);
temp = x >> (4 * (i - 1));

temp = input[0] >> (4 * (i - 1));

现在你可以看到你实际上正在向右移动0,4,8,12 ......位的相同值。当向右移动值时,您从左侧填充0,因此在循环的2次迭代之后,您的temp变量始终为0。

  

E1&gt;&gt;的结果E2 E1 右移 E2 位位置。如果 E1 具有无符号类型或 E1 具有有符号类型和非负值,则结果的值是 E1 <的商的不可分割部分/ strong> / 2 ^ E2 。如果 E1 具有签名类型和负值,则结果值是实现定义的。 - ISO/IEC 9899:TC3, Section 6.5.7: Bitwise shift operators

您需要递增input指针。但是在代码中,您需要为每个字节重复两次代码 - 对于uint8的低4位和高4位。

我就是这样做的(用comment中的Olaf指出的内联函数替换宏):

/*! \brief Convert nibble (lower 4 bits) to HEX value to avoid using standard libraries.
 */
static inline __attribute__((always_inline, const)) char
NibbleToHex(uint8_t nibble)  {
    return ((nibble <= 9) ? ('0' + nibble) : ('A' + nibble - 10));
}

static void HexToAscii(const uint8_t *input, char *output, uint8_t size) {
    while (size--) {
        *(output++) = NibbleToHex((*input) >> 4u);
        *(output++) = NibbleToHex((*input) & 0x0Fu);
        input++; /*< Move to the next byte. */
    }
}

uint8_t ReferenceNumber[8] = {0x30, 0x40, 0x60, 0x50, 0x80, 0x60, 0x75, 0x95};
HexToAscii(ReferenceNumber, output, sizeof(ReferenceNumber) / sizeof(ReferenceNumber[0])); 

注意output必须始终是输入数据大小的两倍(假设size变量等于输入数据的长度)。