c中的十六进制到ASCII

时间:2012-02-10 11:43:12

标签: c hex bit-manipulation asciiencoding

这是我的逻辑,在C:

中将HEX转换为ASCII转换
for (i=0;i<ArraySize;i++)
    {
        /*uses a bitwise AND to take the top 4 bits from the byte,
         0xF0 is 11110000 in binary*/
        char1 = Tmp[i] & 0xf0;
        char1 = char1 >> 4;
        /*bit-shift the result to the right by four bits (i.e. quickly divides by 16)*/
        if (char1 >9)
        {
            char1 = char1 - 0xa;
            char1 = char1 + 'A';
        }
        else
        char1 = char1 + '0';
        Loc[j]=char1;
        j++;
        /*means use a bitwise AND to take the bottom four bits from the byte,
        0x0F is 00001111 in binary*/
        char1 = Tmp[i] & 0x0f;
        if (char1 >9)
        {
            char1 = char1 - 0xa;
            char1 = char1 + 'A';
        }
        else
        char1 = char1 + '0';
        Loc[j]=char1;
        j++;
        Loc[j]=0;
    }

Temp和Loc是字符串缓冲区。定义并拥有数据。它工作不正常。我正在从某个文件中读取temp中的数据(样本fread)。它在特定点停止读取文件。如果我先改变

  

0xf0

  

为0x0F

以下是文件的阅读方式:

BytesRead = fread (Tmp,1,Bytes,PrcFile);

然后它读取整个文件。我无法找到遗漏的东西。在这方面你能帮我吗? 感谢

2 个答案:

答案 0 :(得分:2)

这不是一个答案,而是一个观察 - 使用它,因为它格式化代码

static char lookup[] = { '0', '1', '2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
int j = 0;
for (i=0; i<ArraySize; ++i)
{
   loc[j++] = lookup[(Tmp[i] & 0xf0) >> 4];
   loc[j++] = lookup[Tmp[i] & 0xf];
}
loc[j] = 0;

使代码更快更简单。

答案 1 :(得分:0)

尽管Ed已经提供了一个更短的解决方案,但我试图弄清楚出了什么问题,因为你的代码“看起来”是正确的。

我猜:char1已签名(例如输入“char”)。

然后发生了:

  • 文件中> 127的字节在&0xf0期间保持其标志,

  • >> 4是一个带符号的移位,使位模式保持位设置在最高位

  • 然后你比较>9并非如此,因为符号位仍然设置

  • 然后你添加+'0',现在可以导致你有一个值为0的字节而不是 '0' - '9'或'A' - 'F'之间的东西。

  • 在打印时终止字符串