【问题标题】:c++, convert std::string to uint8_tc++,将 std::string 转换为 uint8_t
【发布时间】:2019-03-11 16:06:50
【问题描述】:

在我正在研究的 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* 也不起作用。

【问题讨论】:

  • strcpy 什么时候被弃用了?
  • 那个字符串是什么?
  • 您可以使用std::string::data() 获取指向字符串数据的指针。
  • strcpy_s 不是标准的 c++,而是 MSVC 特有的,之前不知道,必须查一下,不知道为什么你认为这无关紧要......
  • @EtiennedeMartel 我知道,那是 C 而不是 C++

标签: c++ visual-c++ stdstring uint8t


【解决方案1】:

使用向量,您正在编写的是 VLA,它不是有效的 C++ (U8 char_array[d.length()])。然后使用std::copy

const std::string& d = frame.getData();
std::vector<U8> char_array(d.length() + 1, 0);

问题是你是否需要字符串结尾\0,所以如果你想要最后一个\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++ 书籍。

【讨论】:

  • 谢谢,但我有一个结构,其中一个成员是 uint8_t Data[8];,因此我希望将字符串转换为 uint8_t 数组。所以向量对我没用
  • 在这种情况下,放弃向量,只使用std::copy。它仍然是您问题的正确答案。像你一样创建一个中间 char_array 是行不通的。
【解决方案2】:

更新:从您的 cmets 看来,您有一个编译时间常数的最大大小,我添加了一个真正的数组版本:

#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;
};

【讨论】:

  • 谢谢,但vectorstd::array 对我都没有用,我想要unint8_t [] 的形式
  • @Amir-Mousavi std::array 确实持有 uint8_t[],为什么这没有用?
  • @Amir-Mousavi 很抱歉给您带来坏消息,但是像任何T[] 包括uint8_t[] 在内的简单内置数组将无法按预期工作,因为内置数组会衰减为指针。因此,即使您正在编写 [],您也只能返回 uint8_t*,并且必须使用更不安全的函数,例如 new/malloc、strcpy 或预处理器宏。您可以通过.data()std:arrays 用作任何内置数组
  • 好吧,当你甚至没有得到一个赞成票时,这不是很好,因为 OP 发布了一个 AB 问题......
猜你喜欢
  • 1970-01-01
  • 2021-04-11
  • 2022-01-09
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多