c++ - char 数组到 uint8_t 数组

标签 c++ casting char buffer unsigned

这是我一直不擅长的C/C++领域。

我的问题是我有一个最终需要包含一些空字符的字符串。将所有内容都视为 char 数组(或字符串)是行不通的,因为当它们找到第一个 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 数组?只是将 uint8_t 指针静态转换为 char 指针?

非常感谢。

最佳答案

i thought, ok, i'll switch over to uint8_t, so everything is just a number.

这不会让寻找“\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]());

或使用 vector :

std::vector<uint8_t> val(s.length()+1,0);

要从 uint8_t 数组中转换,您可以(但通常不应该)执行以下操作:

char *c = reinterpret_cast<uint8_t*>(val);

关于c++ - char 数组到 uint8_t 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10840147/

相关文章:

c# - 无法将类型 'system.byte ' 的对象强制转换为类型 'system.iconvertible'

c++ - 基类指针赋值给派生类的底层机制是什么

c++ - 更有效的删除空格的方法

c++ - B不将8作为输入是什么? C++

c++ - 如何为实例变量设置观察点?

c++ - STL 中的 find() 与 binary_search()

c++ - 在 Omnetpp 中从消息到数据包的类型转换

c++ - 在生产代码中删除 dynamic_casts 是否安全?

c - c中的字符串比较

C语言字符数组三角形,字符之间用空格分隔