Hex для ASCII в с - PullRequest
       38

Hex для ASCII в с

2 голосов
/ 10 февраля 2012

Вот моя логика для преобразования преобразования HEX в 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;
    }

Temp и Loc - строковые буферы.Определен и имеет данные.Это не работает должным образом.Я читаю данные в temp из некоторого файла (образец фреда).Это прекратить чтение файла в определенной точке.Если я сначала изменю

0xf0

на

0x0f

Вот как читается файл:

BytesRead = fread (Tmp,1,Bytes,PrcFile);

Затем он читает весь файл.Я не могу найти то, чего не хватает.Можете ли вы помочь мне в этом отношении.Спасибо

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Это не ответ, а наблюдение - используя его, поскольку он форматирует код

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

Несмотря на то, что Эд уже предоставил более короткое решение, я попытался выяснить, что было не так, потому что ваш код «выглядел» правильно.

Позвольте мне предположить: char1 подписан (например, тип «char»).1003 *

Тогда случается, что:

  • байт в вашем файле, который> 127 сохраняет свой знак во время &0xf0,

  • и >> 4 - это сдвиг со знаком, который заставляет битовую комбинацию сохранять бит установленным в старшем значимом бите

  • , затем вы сравниваете >9, что не так, потому чтобит знака по-прежнему установлен

  • , затем вы добавляете +'0', что может привести к тому, что у вас будет байт со значением 0 вместо чего-то между '0' - '9' или 'A'-'F'.

  • , который завершает строку при печати

...