c中的hex到ASCII

这是我的逻辑,在C中将HEX转换为ASCII转换:

for (i=0;i> 4; /*bit-shift the result to the right by four bits (ie 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); 

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

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

 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> 4]; loc[j++] = lookup[Tmp[i] & 0xf]; } loc[j] = 0; 

使代码更快更简单。

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

我猜:char1是签名的(例如键入“char”)。

然后它发生了:

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

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

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

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

  • 在打印时终止字符串

Interesting Posts