Я не понимаю эту строку кода (hexchar_to_int (str [i]) << 4) | hexchar_to_int (str [i + 1])). Может кто-нибудь объяснит мне - PullRequest
0 голосов
/ 12 января 2020

Я просмотрел эти строки кода, которые использовались для преобразования строки в двоичный файл, но я не могу понять, что делает эта строка кода (hexchar_to_int (str [i]) << 4) | hexchar_to_int (str [i + 1]), я разочарован этой битовой манипуляцией здесь, используется 8 битов unsigned int, и мы сдвинулись влево, чтобы получить как минимум 4 значащих бита. Но я не знаю, как это сделать. </p>

unsigned char hexchar_to_int(char const ch)
{
    if (ch >= '0' && ch <= '9') return ch - '0';
    if (ch >= 'A' && ch <= 'F') return ch - 'A' + 10;
    if (ch >= 'a' && ch <= 'f') return ch - 'a' + 10;
    throw std::invalid_argument("Invalid hexadecimal character");
 }

 std::vector<unsigned char> hexstr_to_bytes(std::string_view str)
 {
     std::vector<unsigned char> result;
     for (size_t i = 0; i < str.size(); i += 2)
     {
          result.push_back((hexchar_to_int(str[i]) << 4) | hexchar_to_int(str[i+1]));
     }
     return result;

 }

1 Ответ

1 голос
/ 13 января 2020

<<4 равно *2^4 или *16, смещение влево , а не вправо.
| представляет собой простое добавление двух символов гекса в их правильном месте.
См. 0xab = 10 * 16 + 11 = 171

...