在C++20中,如何从unsigned char* 计算长度?
我有个想法,给字符串添加文本,但不知道该如何为 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 char、signed char 和 char 的大小恰好都是一个字节,因此 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。