1

画像をダウンロードし、std::string. 今、私は次の条件でそれを使用/開きたい:

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

stringからにキャストするにはどうすればよいbyte*ですか?

/EDIT:
私はすでにこれを試しました:

_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

2 つの可能性:

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 の補数システムはほぼ存在しません。たとえあったとしても、char2 の補数ではなく署名されたシステムが提供する可能性はかなり低いと思いますuint8_t(もしそうなら、それも提供しなければならないからですint8_t)。したがって、(2) は衒学的な完全性のみを提供します。

バイトを間違って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 に答える