C++中如何将const char*复制到uint8_t[]?示例中怎么复制msg1到msg2?
在C++中复制const char*到uint8_t数组的方法
嘿,这个问题其实挺常见的,我来给你梳理几种靠谱的实现方式,尤其是针对你提到的把msg1的值复制到uint8_t msg2[]的场景~
首先得明确一个关键点:在C++标准里,uint8_t本质上就是unsigned char的别名(只要你的平台支持这个类型),而const char*指向的字符序列是单字节存储的,所以两者可以直接按字节复制,完全兼容。
方法1:用memcpy(最推荐、高效)
memcpy是C标准库(C++里也能用)的字节复制函数,它不管数据类型,只按指定字节数复制内存内容,非常适合这种场景。
示例代码:
#include <cstring> // 必须包含这个头文件才能用memcpy int main() { const char* msg1 = "Hello, Stack Overflow!"; uint8_t msg2[50]; // 一定要保证数组大小足够容纳msg1的内容(包括终止符) // 计算字符串长度,+1是为了复制末尾的'\0'终止符 size_t str_len = std::strlen(msg1) + 1; // 执行复制 std::memcpy(msg2, msg1, str_len); // 验证一下(可选) printf("msg2内容:%s\n", reinterpret_cast<char*>(msg2)); return 0; }
注意事项:
- 如果复制的是二进制数据(不是带
'\0'的字符串),不要用strlen,要手动传入明确的字节长度,比如:const char* binary_msg1 = ...; // 你的二进制数据 size_t binary_len = 128; // 已知的二进制数据长度 uint8_t msg2[128]; std::memcpy(msg2, binary_msg1, binary_len); - 务必确保
msg2的数组大小 ≥ 要复制的字节数,否则会触发缓冲区溢出,导致未定义行为。
方法2:手动循环复制(适合需要逐字节控制的场景)
如果你想自己控制每一步的复制逻辑,可以用循环逐个字节复制,显式转换类型会更符合C++的风格。
示例代码:
int main() { const char* msg1 = "Hello, World!"; uint8_t msg2[50]; size_t i = 0; // 复制到终止符为止 while (msg1[i] != '\0') { // 显式转换为uint8_t,避免隐式转换的潜在问题 msg2[i] = static_cast<uint8_t>(msg1[i]); i++; } // 别忘了加上字符串终止符(如果需要的话) msg2[i] = '\0'; return 0; }
方法3:用C++ STL的std::copy(适合STL爱好者)
如果你习惯用C++的STL容器,也可以先把const char*转成std::string,再用std::copy复制到数组里:
示例代码:
#include <string> #include <algorithm> // 包含std::copy的头文件 int main() { const char* msg1 = "Hello, STL!"; std::string msg_str(msg1); uint8_t msg2[50]; // 复制字符串内容到数组 std::copy(msg_str.begin(), msg_str.end(), msg2); // 加上终止符 msg2[msg_str.size()] = '\0'; return 0; }
这个方法可读性不错,但效率略低于memcpy,如果是性能敏感的场景还是优先用memcpy。
内容的提问来源于stack exchange,提问作者Sukesh Chand
相关产品推荐
相关产品推荐

