十六进制ASCII码在C
这里是我的逻辑,以十六进制转换为ASCII的转换在C:十六进制ASCII码在C
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;
}
温度和LOC的字符串缓冲区。定义并有数据。它工作不正常。我正在从一些文件(样本fread)读取temp中的数据。它停止在特定点阅读文件。如果我改变第一
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<ArraySize; ++i)
{
loc[j++] = lookup[(Tmp[i] & 0xf0) >> 4];
loc[j++] = lookup[Tmp[i] & 0xf];
}
loc[j] = 0;
使代码快了很多,更简单。
谢谢Ed的输入。让我这样做,可能会有所改变。 – QMG 2012-02-10 11:59:17
哦 - 确保loc的长度是(至少)2 * ArraySize + 1 – 2012-02-10 12:04:06
即使爱德已经提供了一个较短的解决方案,我试图找出什么是错的,因为你的代码“看起来”是正确的。
让我猜猜:char1是有符号的(例如键入“char”)。
然后,它会发生,即:
在文件中的字节是> 127时
&0xf0
保持它的标志,和
>> 4
是有符号转变,这使得该位模式保持在最高有效位中设置的位然后你比较
>9
这不是这种情况,因为符号位仍然设置为然后你添加
+'0'
现在可以导致你有一个值为0的字节而不是 '0' - '9'或'A' - 'F'之间的东西。终止字符串,而打印
我假设读取的数据是无符号字符。 – 2012-02-10 12:15:56
是的,这似乎是问题所在。试一试你的代码,把'char1'的声明改为'unsigned char'。 – 2012-02-10 12:23:13
我试图在不同的文件上运行它,但它从文件中读取相同数量的字节并停止。无论文件大小是30 K还是100K – QMG 2012-02-10 12:23:48
你能证明确实的文件读/写的代码?该算法看起来正确。 – 2012-02-10 11:46:51
看起来更像是一个BIN到HEX(ASCII)的转换。 – Till 2012-02-10 11:47:20
添加读取文件和构建数组的代码。 – 2012-02-10 11:47:47