c++, 将 std::string 转换为 uint8_t
c++, convert std::string to uint8_t
在我正在处理的 c++ 解决方案中,我有一个 returns 字符串引用的函数。像 const std::string& getData() const {return mData;}
并且 mData 是 std::string mData;
。现在我想将它转换为 uint8_t
数组以将其传递给另一个函数指针。
/* in another header -> typedef uint8_t U8; */
const std::string& d = frame.getData();
U8 char_array[d.length()];
/* here I want to put the d char by char in char_array*/
strcpy
已弃用,所以我使用 strcpy_s
就像 strcpy_s(char_array, d);
我当然明白couldn't match type char(&)[_size] against unsigned char[]
并且静态或重新解释转换为 char*
也不起作用。
使用向量,你写的是 VLA,它不是有效的 C++ (U8 char_array[d.length()]
)。然后使用 std::copy
.
const std::string& d = frame.getData();
std::vector<U8> char_array(d.length() + 1, 0);
问题是您是否需要字符串的结尾 [=15=]
,所以如果您想要最后一个 [=15=]
,它将是 d.length()+1。那么:
std::copy(std::begin(d), std::end(d), std::begin(char_array));
更新:显然,目标是将此向量存储在另一个 uint8_t[8]
中,如果它是一个名为 foo
的变量,只需执行:
std::copy(std::begin(d), std::end(d), std::begin(foo));
但先检查长度...然后将结构传递给填充作为参考。也得到一本好的 C++ 书。
更新:因为从你的评论看来你有一个编译时常量最大大小,我添加了一个真正的数组版本:
#include <string>
#include <vector>
#include <cstdint>
#include <algorithm>
#include <iterator>
#include <array>
struct foo {
std::string& getData() {return mData;}
const std::string& getData() const {return mData;}
std::vector<uint8_t> get_array() const {
std::vector<uint8_t> array;
std::copy(mData.cbegin(), mData.cend(), std::back_inserter(array));
return array;
};
static constexpr size_t max_size = 8u;
std::array<uint8_t, max_size> get_max_array() const {
std::array<uint8_t, max_size> array;
std::copy_n(mData.cbegin(), max_size, array.begin());
return array;
}
private:
std::string mData;
};
在我正在处理的 c++ 解决方案中,我有一个 returns 字符串引用的函数。像 const std::string& getData() const {return mData;}
并且 mData 是 std::string mData;
。现在我想将它转换为 uint8_t
数组以将其传递给另一个函数指针。
/* in another header -> typedef uint8_t U8; */
const std::string& d = frame.getData();
U8 char_array[d.length()];
/* here I want to put the d char by char in char_array*/
strcpy
已弃用,所以我使用 strcpy_s
就像 strcpy_s(char_array, d);
我当然明白couldn't match type char(&)[_size] against unsigned char[]
并且静态或重新解释转换为 char*
也不起作用。
使用向量,你写的是 VLA,它不是有效的 C++ (U8 char_array[d.length()]
)。然后使用 std::copy
.
const std::string& d = frame.getData();
std::vector<U8> char_array(d.length() + 1, 0);
问题是您是否需要字符串的结尾 [=15=]
,所以如果您想要最后一个 [=15=]
,它将是 d.length()+1。那么:
std::copy(std::begin(d), std::end(d), std::begin(char_array));
更新:显然,目标是将此向量存储在另一个 uint8_t[8]
中,如果它是一个名为 foo
的变量,只需执行:
std::copy(std::begin(d), std::end(d), std::begin(foo));
但先检查长度...然后将结构传递给填充作为参考。也得到一本好的 C++ 书。
更新:因为从你的评论看来你有一个编译时常量最大大小,我添加了一个真正的数组版本:
#include <string>
#include <vector>
#include <cstdint>
#include <algorithm>
#include <iterator>
#include <array>
struct foo {
std::string& getData() {return mData;}
const std::string& getData() const {return mData;}
std::vector<uint8_t> get_array() const {
std::vector<uint8_t> array;
std::copy(mData.cbegin(), mData.cend(), std::back_inserter(array));
return array;
};
static constexpr size_t max_size = 8u;
std::array<uint8_t, max_size> get_max_array() const {
std::array<uint8_t, max_size> array;
std::copy_n(mData.cbegin(), max_size, array.begin());
return array;
}
private:
std::string mData;
};