在C++20中,如何从unsigned char* 计算长度?

编程语言 2026-07-12

我有个想法,给字符串添加文本,但不知道该如何为 unsigned char* 计算它。

const char* 的大小是否和 const unsigned char* 一样?

const std::string s = "....";
const unsigned char* data = reinterpret_cast<const unsigned char*>(
                                std::u8string(s.begin(), s.end()).data());
size_t len = std::ssize(s);

在线演示:https://godbolt.org/z/xqhnxG7sr

https://www.sendspace.com/file/l6x2iz

测试将const unsigned char* 转换为unsigned char[]。

    printf("data: ");
    for (int k = 0; k < (int)len; k++) {
        data[k];
        printf("%c", data[k]);
    }
    printf(", len: %d\n", (int)ff_ffv1_enc_rct_search_comp_spv_len);

对于gcc 15.2.0,一切似乎都在正常工作,但好像少了点什么。也许是内存。

解决方案

是的,unsigned charsigned charchar 的大小恰好都是一个字节,因此 s.size() 能得到字符串的字节大小。

后面的两行是多余的,同时也值得注意一些问题:

  • std::u8string(s.begin(), s.end()).data() 正在获取指向临时 char8_t 数组的指针,因此该指针会立即悬空。此外,以那样的方式调用 std::u8string 的构造函数并不能进行任何转码。你的原始字符串本来就需要是UTF-8,否则这就没什么意义。
  • 在这里没有理由使用 std::ssize 而不是 std::size。你无论如何都想得到一个 std::size_t 的结果,而 std::size 可以直接做到。

假设你的目标是获取 std::string 的UTF-8字节,正确的写法看起来如下:

std::string s = "...";
std::span<const unsigned char> ut8_bytes(
  reinterpret_cast<const unsigned char*>(s.data()),
  s.size()
);

当然,这显然假设你的字符串字面量是UTF-8编码的。如果不是,在取字节之前你需要将 s 转码为UTF-8。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章