char数组到uint8_t数组

时间:2012-05-31 19:35:56

标签: c++ casting char buffer unsigned

这是我从未擅长的C / C ++的一个领域。

我的问题是我有一个字符串,最终需要包含一些空字符。将所有东西视为char数组(或字符串)都不起作用,因为当它们找到第一个null时往往会废弃。所以我想,好吧,我会切换到uint8_t,所以一切都只是一个数字。我可以根据需要移动东西,并在我准备好时把它扔回炭中。

我现在的主要问题是:如何将字符串的一部分复制到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指向char指针的uint8_t指针?

非常感谢。

2 个答案:

答案 0 :(得分:1)

  

我想,好吧,我会切换到uint8_t,所以一切都只是一个数字。

这不会使寻找'\ 0'的算法突然停止这样做,使用char 的算法也也不会注意'\ 0'。用空字符表示结尾信号是C字符串的约定,而不是字符数组。 uint8_t可能只是char的typedef。

正如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);

答案 1 :(得分:0)

嗯,代码工作正常,它会复制val中的子字符串。但是,在偏移之前,所有位置都将为0。

e.g。 for offset = 2 val将为{0,0,b,c,d,e,f,0,0,0}

如果你打印它,它将不显示任何内容,因为字符串在第一个位置终止(我猜这是你所说的错误......)。