Строковый вектор в uint8_t C ++ - PullRequest
0 голосов
/ 23 мая 2018

У меня есть вектор со строками , которые представляют биты следующим образом:

string str1[] = { "0b01100101", "0b01100101", "0b01011101", "0b11001111"}

, и мне нужны точные значения, добавленные в вектор битов uint8_t:

uint8_t str2[] = { 0b01100101, 0b01100101, 0b01011101, 0b11001111}

Конечный результат должен выглядеть точно так же, как указано выше.Если у кого-то есть идеи, как я могу это сделать, я буду признателен.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Обратите внимание, что они, скорее всего, будут выводить почти такую ​​же или ту же сборку, что и алгоритм, поэтому алгоритм, подобный другому, почти всегда предпочтителен.Тем не менее, вот еще несколько вариантов, использующих циклы:

std::stoul - требуется как минимум C ++ 11.Мы также не проверяем границы здесь, мы предполагаем, что все строки имеют размер >= 2.

std::string str1[] = {"0b01100101", "0b01100101", "0b01011101", "0b11001111"};
const size_t sz = sizeof str1 / sizeof *str1;
uint8_t str2[sz];
for (size_t i = 0; i < sz; ++i)
    str2[i] = static_cast<uint8_t>(std::stoul(&str1[i][2], nullptr, 2));

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

std::vector<std::string> vs;
// add a bunch of stuff to vs
...

std::vector<uint8_t> vi;
vi.reserve(vs.size());
for (const auto &s : vs)
    vi.push_back(static_cast<uint8_t>(std::stoul(&s[2], nullptr, 2)));
0 голосов
/ 23 мая 2018

К сожалению, стандартной функции для разбора двоичных строк с префиксом "0b" не существует.

Вы можете использовать старый добрый std::strtoul (1 строка для вызова std::strtoul и 5строки проверки ошибок):

#include <algorithm>
#include <stdexcept>
#include <cstdlib>
#include <string>

uint8_t binary_string_to_uint8(std::string const& s) {
    if(s.size() != 10 || '0' != s[0] || 'b' != s[1])
        throw std::runtime_error("Invalid bit string format: " + s);
    char* end = 0;
    auto n = std::strtoul(s.c_str() + 2, &end, 2);
    if(end != s.c_str() + s.size())
        throw std::runtime_error("Invalid bit string format: " + s);
    return n;
}

int main() {
    std::string str1[] = { "0b01100001", "0b01100101", "0b01011101", "0b11001111"};
    uint8_t str2[sizeof str1 / sizeof *str1];
    std::transform(std::begin(str1), std::end(str1), std::begin(str2), binary_string_to_uint8);
}
...