字符数组到uint8_t数组
char array to uint8_t array
这是我从来不擅长的C/C++的一个领域。
我的问题是我有一个字符串,最终需要包含一些空字符。 将所有内容视为字符数组(或字符串)是行不通的,因为当他们找到第一个 null 时,事情往往会变得废话。 所以我想,好吧,我会切换到uint8_t,所以一切都只是一个数字。 我可以根据需要移动东西,并在准备好时将其投射回 char。
我现在的主要问题是:如何将字符串的一部分复制到uint8_t缓冲区?
实际上,我想做这样的事情:
std::string s = "abcdefghi";
uint8_t *val = (uint8_t*)malloc(s.length() + 1);
memset(val, 0, s.length() + 1);
// Assume offset is just some number
memcpy(val + offset, s.substr(1, 5).c_str(), 5);
显然,当我尝试这个时,我会收到一个错误。 在memcpy的第一个参数中可能可以做一些诡计(我在网上看到类似(*(uint8_t*))的东西,但不知道这意味着什么)。
有什么帮助吗?
当我在这里时,我如何轻松地将其转换回 char 数组? 只是static_cast uint8_t指针指向字符指针?
多谢。
我想,好吧,我会切换到uint8_t,所以一切都只是一个数字。
这不会让寻找"\0"的算法突然停止这样做,使用 char 的算法也不必注意"\0"。用空字符表示结束是 C 字符串的约定,而不是 char 数组。无论如何,uint8_t可能只是 char 的类型定义。
正如Nicol Bolas指出的那样,std::string已经能够存储包含空字符的字符串,而无需特别处理空字符。
至于你的问题,我不确定你指的是什么错误,因为以下内容工作得很好:
#include <iostream>
#include <string>
#include <cstdint>
#include <cstring>
int main() {
std::string s = "abcdefghi";
std::uint8_t *val = (std::uint8_t*)std::malloc(s.length() + 1);
std::memset(val, 0, s.length() + 1);
int offset = 2;
std::memcpy(val + offset, s.substr(1, 5).c_str(), 5);
std::cout << (val+offset) << 'n';
}
memcpy 行从字符串s
中获取第二到第六个字符,并将它们复制到 val 中。然后,带有 cout 的行打印"bcdef"。
当然,这是C++,所以如果你想手动分配一些内存并将其归零,你可以这样做,就像
:std::unique_ptr<uint8_t[]> val(new uint8_t[s.length()+1]());
或使用向量:
std::vector<uint8_t> val(s.length()+1,0);
要从uint8_t数组进行强制转换,您可以(但通常不应该)执行以下操作:
char *c = reinterpret_cast<uint8_t*>(val);
好吧,代码工作正常,它复制了 val 中的子字符串。但是,在偏移之前,所有位置上都将有 0。
例如,对于偏移量=2 val 将是 {0, 0, b, c, d, e, f, 0, 0, 0}
如果您打印此内容,它将不显示任何内容,因为字符串在第一个位置以 null 结尾(我想这就是您所说的错误......
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 按字符值访问int数组
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 移动二维数组中的字符
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- C++ 带结构的数组字符
- 数组字符包含量超出预期
- 读取文件并添加到数组字符
- 如何在Qt中更改或替换数组字符
- 为什么编译器不在参数中传递数组字符 *arr[] 的大小?
- 井字棋数组字符错误
- 分割数组字符