十六进制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); 

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

+0

你能证明确实的文件读/写的代码?该算法看起来正确。 – 2012-02-10 11:46:51

+0

看起来更像是一个BIN到HEX(ASCII)的转换。 – Till 2012-02-10 11:47:20

+0

添加读取文件和构建数组的代码。 – 2012-02-10 11:47:47

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

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; 

使代码快了很多,更简单。

+0

谢谢Ed的输入。让我这样做,可能会有所改变。 – QMG 2012-02-10 11:59:17

+1

哦 - 确保loc的长度是(至少)2 * ArraySize + 1 – 2012-02-10 12:04:06

即使爱德已经提供了一个较短的解决方案,我试图找出什么是错的,因为你的代码“看起来”是正确的。

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

然后,它会发生,即:

  • 在文件中的字节是> 127时&0xf0保持它的标志,

  • >> 4是有符号转变,这使得该位模式保持在最高有效位中设置的位

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

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

  • 终止字符串,而打印

+0

我假设读取的数据是无符号字符。 – 2012-02-10 12:15:56

+0

是的,这似乎是问题所在。试一试你的代码,把'char1'的声明改为'unsigned char'。 – 2012-02-10 12:23:13

+0

我试图在不同的文件上运行它,但它从文件中读取相同数量的字节并停止。无论文件大小是30 K还是100K – QMG 2012-02-10 12:23:48