这是我的逻辑,在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);
然后它读取整个文件。我无法找到遗漏的东西。在这方面你能帮我吗? 感谢
答案 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'之间的东西。
在打印时终止字符串