gpt4 book ai didi

c++ 字符串到 uint8_t

转载 作者:行者123 更新时间:2023-11-28 03:29:49 25 4
gpt4 key购买 nike

我下载了一张图片,它保存在 std::string 中。现在我想在以下条件下使用/打开它:

typedef uint8_t byte //1 byte unsigned integer type.  
static open(const byte * data, long size)

如何从 string 转换为 byte*

/编辑:
我已经试过了:

_data = std::vector<byte>(s.begin(), s.end()); 
//_data = std::vector<uint8_t>(s.begin(), s.end()); //also fails, same error
_p = &_data[0];
open(_p, _data.size())

但我得到:
对“open(unsigned char const*, long)”的 undefined reference
为什么它会将 byte 错误地解释为 char?!

/编辑2:只是为了测试它,我更改为函数调用

 open(*_p, _data.size())

但后来我得到:

error: no matching function for call to 'open(unsigned char&, size_t)'
[...] open(const byte*, long int) <near match>

所以函数确实找到了......

最佳答案

两种可能性:

1) 普通的。在您的系统上,char要么是 2 的补码,要么是无符号的,因此将字符读取为无符号字符是“安全的”,并且(如果 char 是有符号的)结果与从有符号转换为无符号相同。

在这种情况下,使用 reinterpret_cast<const uint8_t*>(string.data()) .

2) 不常见的。在您的系统上,char是有符号的而不是 2 的补码,因此对于 char *ptr指向负值 *(uint8_t*)ptr 的结果不等于 (uint8_t)(*ptr) .然后取决于什么open实际上对数据进行处理,以上可能没问题,或者您可能必须将数据从字符串中复制到 uint8_t 的容器中, 随时转换。例如,vector<uint8_t> v(string.begin(), string.end()); .然后使用 &v[0] 前提是长度不为 0(与字符串不同,您不允许使用指向空 vector 数据的指针,即使您从未取消引用它也是如此)。

非 2 的补码系统几乎不存在,即使有一个我认为也不太可能是 char 的系统已签名,而不是 2 的补码将提供 uint8_t完全没有(因为如果这样做,那么它还必须提供 int8_t )。所以 (2) 仅服务于迂腐的完整性。

why does it interpret byte wrongly as char

没有错,uint8_tunsigned char 的类型定义在您的系统上。

关于c++ 字符串到 uint8_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12894071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com