Преобразовать строку в байты в C ++ - PullRequest
0 голосов
/ 23 июня 2018

Я новичок в c ++ и все еще пытаюсь почувствовать себя. Я попытался адаптировать найденную в SO функцию для преобразования моей строки в байты так, как мне нужно:

void hexconvert(const char *text, unsigned char bytes[])
{
    int i;
    int temp;

    for (i = 0; i < 4; ++i) {
        sscanf(text + 2 * i, "%2x", &temp);
        bytes[i] = temp;
    }

    cout << bytes;
}

hexconvert("SKY 000.001\n", );

Проблемы Iесть:

1) Я не уверен, как изменить цикл for для обработки моей строки.2) Я не уверен, что мне следует использовать в качестве ввода для второго параметра в функции.

Кто-нибудь может помочь?

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Это мое предлагаемое решение. Я использовал его для кодирования GUID в виде байтового массива. Он должен достичь более высокой производительности, чем printf для всех символов.

typedef unsigned char byte;

std::map<char, byte> char2hex = 
{
  {'0', 0x0},
  {'1', 0x1},
  {'2', 0x2},
  {'3', 0x3},
  {'4', 0x4},
  {'5', 0x5},
  {'6', 0x6},
  {'7', 0x7},
  {'8', 0x8},
  {'9', 0x9},
  {'a', 0xa},
  {'b', 0xb},
  {'c', 0xc},
  {'d', 0xd},
  {'e', 0xe},
  {'f', 0xf}
};

void convertToBytes(const string &chars, byte bytes[])
{
  for (size_t i = 0; i < chars.length() / 2; i++) {
    byte b1 = (byte)(char2hex[chars[2*i]] << 4);
    byte b2 = char2hex[chars[2*i+1]];
    byte f = b1 | b2;
    *(bytes + i) = f;
  }
}

Помните, что два символа ascii составляют один байт, поэтому для каждой пары символов мне нужно преобразовать первый символ в байт, затем сдвинуть его на 4 бита, а затем или со следующим символом, чтобы получить один байт.

0 голосов
/ 23 июня 2018

Для печати строки в байтах:

const size_t length = data.length();
for (size_t i = 0; i < length; ++i)
{
  unsigned int value = data[i];
  std::cout << std::dec << std::fill(' ') << value
            << " (0x" << std::setw(2) << std::setfill('0') << std::hex << value << ')'
            << "\n";
}

Некоторые важные правила, которые нужно запомнить:
1. Скопируйте символ в переменную целочисленного типа, чтобы cout не печаталось как символ.
2. Байты не подписаны.
3. При заполнении ширины 0 для шестнадцатеричного значения не забудьте сбросить его до пробела перед печатью десятичного числа.
4. Используйте std::hex для печати в шестнадцатеричном формате, и не забудьте сбросить его с помощью std::dec впоследствии (если вы печатаете в десятичном виде впоследствии).

См. <iomanip>.

Редактировать 1: стиль C
Чтобы использовать стиль языка C:

static const char data[] = "Hello World!";
const size_t length = strlen(data);
for (size_t i = 0; i < length; ++i)
{
  printf("%3d (0x%02X)\n", data[i], data[i]);
}

Вышеприведенное предполагает, что data является символьным массивом с нулевым окончанием.

...