C中的ASCII到HEX转换问题

时间:2012-02-08 16:54:29

标签: c hex ascii fread

我有这样的功能:

int GetBytes(char *loc, int Bytes)
{
  int BytesRead=0;
  int j = 0;
  int i = 0;
  int fileloc = 0;
  unsigned char TmpLoc[500];
  unsigned char TmpLoc1[500];

  strcpy(loc,"");
  Bytes = Bytes / 2;
  BytesRead = fread(TmpLoc, 1, Bytes,PrcFile); 
  /*Start of conversion*/
  if (ebcidic_flag[0] == 'Y')
  {
    for (i=0; i < BytesRead; i++)
    {
      j = i * 2;
      sprintf(TmpLoc1, "%x", TmpLoc[i]);
      if (strlen(TmpLoc1) < 2)
      {
        strcat(&loc[j], "0");
        j++;
      }
      strcat (&loc[j],TmpLoc1);
    }
  }
  for (i=0;i<(BytesRead*2);i++)
  {
    if ((loc[i] >= 0x60) & (loc[i] <= 0x7a))
      loc[i] = loc[i] & 0xdf;
  }
  /*End of conversion*/
  TotalBytes = TotalBytes + BytesRead;
  return (BytesRead * 2);
}

当我评论转换逻辑时,fread读取整个文件的问题。 但是当激活转换逻辑时,fread不会读取整个文件。 例如,如果我有一个30000字节的文件,它可能只读取1210字节然后返回零。 我的转换逻辑有问题吗? 根据要求确切读取16382后,它只读取2个字节并返回0.我尝试了不同的文件但结果相同

1 个答案:

答案 0 :(得分:0)

您的转换逻辑假定读取的字节数与您期望的完全相同。不幸的是情况并非如此。因此,在循环中,您需要将其更改为查看实际读取的字节:

for (i=0;i<BytesRead;i++)

for (i=0;i<(BytesRead*2);i++)

但除此之外,因为输入/输出是缓冲的,无论如何您可能无法获得所需的所有字节。因此,最好的做法是将fread本身放入循环中,以便检测实际结束的时间,而不是假设您可以一次性读取它:

int TotalRead = 0;
int BytesRead;

while(TotalRead < Bytes && (BytesRead = fread(TmpLoc, 1, Bytes - TotalRead,PrcFile)) > 0) {
    /* do your converting and needed stuff here */
    TotalRead += BytesRead;
}

这样你就会继续读到文件的末尾。或者,当然也可以检查大多数字节的读数。