Проблема преобразования ASCII в HEX в C - PullRequest
1 голос
/ 08 февраля 2012

У меня есть такая функция:

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 голосов
/ 08 февраля 2012

Ваша логика преобразования предполагает, что количество прочитанных байтов будет точно равно ожидаемому.К сожалению, это не так.Таким образом, в вашем цикле вам нужно изменить его на просмотр фактических прочитанных байтов:

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

и

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

Но кроме этого, потому что ввод / вывод буферизуется, и вы не можетевсе равно получите все байты, которые вы хотите.Поэтому лучшее, что нужно сделать, это поместить сам фред в цикл, чтобы вы могли определить, когда наступил фактический конец, а не предполагать, что вы можете прочитать все это за один раз:

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;
}

Таким образом, выпродолжайте читать до конца файла.Или, конечно, вы всегда можете проверить на чтение не более байтов.

...