C++ uint8_t C+的字符串向量+;

C++ uint8_t C+的字符串向量+;,c++,string,bits,C++,String,Bits,我有一个向量,它包含字符串,表示如下位: string str1[] = { "0b01100101", "0b01100101", "0b01011101", "0b11001111"} 我需要将精确值添加到uint8_t位向量: uint8_t str2[] = { 0b01100101, 0b01100101, 0b01011101, 0b11001111} 最终结果应该与上面的完全相同。 如果有人知道我该怎么做,我将不胜感激 不幸的是,没有标准函数来解析前缀为“0b”的二进制字符串

我有一个向量,它包含字符串,表示如下位:

string str1[] = { "0b01100101", "0b01100101", "0b01011101", "0b11001111"}
我需要将精确值添加到uint8_t位向量:

uint8_t str2[] = { 0b01100101, 0b01100101, 0b01011101, 0b11001111}
最终结果应该与上面的完全相同。
如果有人知道我该怎么做,我将不胜感激

不幸的是,没有标准函数来解析前缀为“0b”的二进制字符串

您可以使用good old(1行调用
std::strtoul
和5行错误检查):

#包括
#包括
#包括
#包括
uint8 \u t二进制\u字符串\u到\u uint8(标准::字符串常量&s){
如果(s.size()!=10 | | |“0”!=s[0]| | |“b”!=s[1])
抛出std::runtime_错误(“无效位字符串格式:“+s”);
char*end=0;
自动n=std::strtoul(s.c_str()+2,&end,2);
如果(结束!=s.c_str()+s.size())
抛出std::runtime_错误(“无效位字符串格式:“+s”);
返回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)、二进制字符串到uint8);
}

不幸的是,没有标准函数来解析前缀为“0b”的二进制字符串

您可以使用good old(1行调用
std::strtoul
和5行错误检查):

#包括
#包括
#包括
#包括
uint8 \u t二进制\u字符串\u到\u uint8(标准::字符串常量&s){
如果(s.size()!=10 | | |“0”!=s[0]| | |“b”!=s[1])
抛出std::runtime_错误(“无效位字符串格式:“+s”);
char*end=0;
自动n=std::strtoul(s.c_str()+2,&end,2);
如果(结束!=s.c_str()+s.size())
抛出std::runtime_错误(“无效位字符串格式:“+s”);
返回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)、二进制字符串到uint8);
}

请注意,它们可能会输出与算法几乎相同或相同的程序集,因此类似于另一个答案的算法几乎总是首选的。尽管如此,这里还有几个使用循环的选项:

-至少需要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));

请注意,这些可能会输出与算法几乎相同或相同的程序集,因此类似于另一个答案的算法几乎总是首选的。尽管如此,这里还有几个使用循环的选项:

-至少需要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));

我编辑了str1和str2。你能不能把它们也编辑一下,这样以后可能会用到它的人就很清楚了?谢谢。@CsgoTalksCom完成。我收到一些“非成员”错误。我是否缺少任何库?已经有了这些库:iostream、algorithm、fstream、iomanip、sstream、string、cmath、algorithm、iterator。
std::bitset
via
添加了它,但“bitset不是'std'的成员”我编辑了str1和str2。你能不能把它们也编辑一下,这样以后可能会用到它的人就很清楚了?谢谢。@CsgoTalksCom完成。我收到一些“非成员”错误。我是否缺少任何库?已经有了这些库:iostream、algorithm、fstream、iomanip、sstream、string、cmath、algorithm、iterator。
std::bitset
via
添加了它,仍然是“bitset不是'std'的成员”。如果你不使用C++11,你可以使用
std::strtoul()
来代替,而
std::stoul()
调用它。你也可以考虑使用<代码> S.CyScript()+ 2 < /代码>代替<代码>和S(2)< /C>。如果你不使用C++ 11,你可以使用<代码> STD::StrutUror()/Cuth>,而<代码> STD::StULLUR(< /代码>)调用。您也可以考虑使用<代码> S.CyScript()+ 2 < /代码>代替<代码>和S(2)< /代码>。
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)));