2

这是我的逻辑,在 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 是字符串缓冲区。已定义并有数据。它无法正常工作。我正在从某个文件(示例 fread)中读取 temp 中的数据。它在特定点停止读取文件。如果我先改变

0xf0

0x0f

以下是文件的读取方式:

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

然后它读取整个文件。我找不到丢失的东西。你能在这方面帮助我吗?谢谢

4

2 回答 2

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;

使代码更快更简单。

于 2012-02-10T11:57:13.820 回答
0

尽管 Ed 已经提供了一个更短的解决方案,但我试图找出问题所在,因为您的代码“看起来”正确。

让我猜猜:char1 是有符号的(例如类型“char”)。

然后发生了,即:

  • 文件中大于 127 的字节在 , 期间保持其符号&0xf0

  • 并且>> 4是一个有符号移位,它使位模式保持位设置在最高有效位

  • 然后你比较>9哪个不是这种情况,因为符号位仍然设置

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

  • 在打印时终止字符串

于 2012-02-10T12:08:20.493 回答