在以下示例中
const char* msg1 = "hello how are you";
我想复制到uint8_t msg2[]
如何将msg1值复制到msg2?
答案 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 []
。