1

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

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

我如何从stringto投射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)'的未定义引用
为什么它将字节错误地解释为char?!

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

 open(*_p, _data.size())

但后来我得到:

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

所以这个函数肯定找到了......

4

2 回答 2

3

两种可能:

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 的情况下使用(与字符串不同,即使您从不取消引用,也不允许将指针指向空向量的数据)。

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

为什么它将 byte 错误地解释为 char

没错,是您系统上uint8_t的 typedef 。unsigned char

于 2012-10-15T10:58:50.087 回答
0
std::string string_with_image;

string_with_image.data();
于 2012-10-15T10:54:13.237 回答