Visual C ,将STD :: String转换为UINT8_T

visual c++, convert std::string to uint8_t

本文关键字:UINT8 转换 String STD Visual      更新时间:2023-10-16

在C 解决方案中,我正在处理的我的功能返回字符串参考。像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);

问题是您是否需要结束字符串的末端,因此如果您想要最后一个,则将为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;
};