如何在c ++中将const char *复制到uint8_t []?

时间:2018-02-17 19:10:39

标签: c++

在以下示例中

const char* msg1 = "hello how are you";

我想复制到uint8_t msg2[]

如何将msg1值复制到msg2?

4 个答案:

答案 0 :(得分:1)

const char* msg1 = "hello how are you";
uint8_t msg2[] = "hai";

在该示例中,无法将所有msg1值复制到msg2,因为msg2太小。 msg1指向包含18个字符的数组。 msg2是一个长度为4的数组.18个字符超过4个。

最简单的解决方案是使用矢量。您可以使用以下算法(伪代码)从一个数组复制到另一个数组:

for each element in array at index i
    copy the element at index i into the back of the other array

没有必要自己实现算法,因为标准库已经为您实现了它:std::copy。只要源类型可隐式转换为目标类型,这样就可以正常工作。如果您需要显式转化,则可以改为使用std::transform

  

我想复制到uint8_t msg2[]

没有uint8_t[]这样的类型。当然,您可以使用常规数组,例如uint8_t msg2[18],但您只能复制长度为18或更短的数组。矢量的大小可以在运行时设置,因此它没有这个限制。

答案 1 :(得分:1)

如上所述,您无法将msg1的大小提取为编译时表达式,因此您可能希望改为编写constexpr char msg1[] = "hello how are you";,以便可以使用sizeof(msg1)并获取数组的大小,而不是指针。然后,您可以将该大小用作msg2的界限。

如果您不需要新数组可修改,则可以将指针强加于任何实际存在的实现:const uint8_t * const msg2 = reinterpret_cast<const uint8_t*>(msg1);。如果您需要完全匹配的类型,也可以将其强制转换为与msg1大小相同的数组的引用。或者使msg1数组可修改并将其别名而不是复制。或者将msg2初始化为{'h', 'e', ... }。字符常量是int值,因此这是合法的。

如果要移植复制数组的元素,可以声明它的大小和memcpy( msg2, msg1, MSG1_LEN ),或者你可以编写一个迭代msg1的循环并设置每个{{1 }}。或msg2[i] = static_cast<uint8_t>(msg1[i])push_back的每个元素msg1改为std::vector<uint8_t>

答案 2 :(得分:1)

由于这是一个C&#39;问题,我使用了C风格的演员表。

const char* msg1 = "hello how are you";
size_t length = strlen(msg1) + 1;

const char* beg = msg1;
const char* end = msg1 + length;

uint8_t* msg2 = new uint8_t[length];

size_t i = 0;
for (; beg != end; ++beg, ++i)
{
    msg2[i] = (uint8_t)(*beg);
}

std::cout << msg1 << "\n\n";
std::cout << msg2 << "\n\n";

delete[] msg2;

<强>输出:

hello how are you

hello how are you

答案 3 :(得分:0)

在您的示例中,msg2太小。但如果它不是(如果您使用的话,那就是:uint8_t msg2 [MAX_LEN]):

 memcpy(msg2, msg1, strlen(msg1)+1);

如果msg1不是const而是变量,请使用类似的东西:

int l = strlen(msg1)+1;
uint8_t *msg2 = new uint8_t[l];
memcpy(msg2, msg1, l);

但请记住使用后delete []