Преобразование из std :: string в unsigned char [] - PullRequest
2 голосов
/ 25 марта 2011

Предположим, у меня есть строка str, которая состоит из символов по умолчанию в шестнадцатеричной системе (0-9, a-f):

string str="1234567890abcdef";

У меня также есть пустой массив n-длины (n известен):

unsigned char arr[n] 

Я хотел бы заполнить массив массива значениями str, но определенным образом, как показано ниже:

unsigned char arr[8] = {0x12U, 0x34U, 0x56U, 0x78U, 0x90U, 0xabU, 0xcdU, 0xefU};

Как представляется, строка str была разделена на более мелкие шестнадцатеричные символы. Как мне этого добиться? Алгоритм разделения очень прост, но я не могу понять, как изменить строку на unsigned char и как добавить 0x в начале и U в конце символов.

Ответы [ 3 ]

2 голосов
/ 25 марта 2011

Ваши требования несколько неясны. Выполняет ли следующая программа желаемое действие?

#include <string>
#include <iostream>
#include <cstdio>
#include <iterator>
#include <algorithm>


void str2bin(const std::string& in, unsigned char out[])
{

    const char* data = in.data();
    const std::string::size_type size = in.size();
    for(std::string::size_type i = 0; i < size; i+= 2) {
        unsigned int tmp;
        std::sscanf(data+i, "%02X", &tmp);
        out[i/2] = tmp;
    }
}

int main() {
    unsigned char arr[8];
    str2bin("1234567890abcdef", arr);
    std::cout << std::hex;
    std::copy(arr, arr+8, std::ostream_iterator<unsigned int>(std::cout, ", "));
    std::cout << "\n";
}
1 голос
/ 25 марта 2011

0x12U на самом деле unsigned int, а не char. Это просто случается, чтобы поместиться в символ. Самое главное, это литерал, который используется только компилятором. Оказавшись в памяти, все числа становятся двоичными числами.

В этом случае у вас есть строка, содержащая шестнадцатеричные числа. То есть каждый символ представляет всего 4 бита. Вам нужно будет разобрать это. простая функция будет sscanf. Спецификатор формата %2X читает два шестнадцатеричных символа и сохраняет их в одном целом. Таким образом, вы можете использовать "%2X%2X%2X%2X%2X%2X%2X%2X" для чтения 8 целых чисел, а затем скопировать каждое из них в соответствующий unsigned char.

0 голосов
/ 25 марта 2011

Вы также можете рассмотреть шаблон с разделителями , если вам нужна менее конкретная версия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...