web-dev-qa-db-ja.com

C ++でunsigned char *をstd :: stringに変換する方法は?

unsigned char*がありますが、それをstd::stringに変換します。これを行う最も安全な方法を教えてください。

34
Unicorn

文字列クラスにはunsigned charを受け入れるコンストラクタがないため、unsigned charをcharにキャストする必要がありました。

unsigned char* uc;
std::string s( reinterpret_cast< char const* >(uc) ) ;

ただし、バイト配列にnullが含まれている場合は、配列の一部だけが文字列(最初のnullまでの配列)にならないように、コンストラクタでlength引数を使用する必要があります

size_t len;
unsigned char* uc;
std::string s( reinterpret_cast<char const*>(uc), len ) ;
56
Yacoby

BYTE*はおそらくunsigned char*のtypedefですが、確かに言うことはできません。 BYTEとは何かを教えていただければ助かります。

BYTE *がunsigned char *の場合、std :: string範囲コンストラクターを使用してstd :: stringに変換できます。これは2つの汎用イテレーターを取ります。

const BYTE* str1 = reinterpret_cast<const BYTE*> ("Hello World");
int len = strlen(reinterpret_cast<const char*>(str1));
std::string str2(str1, str1 + len);

そうは言っても、これはいい考えだと思いますか? BYTEunsigned charの場合、非ASCII文字が含まれる場合があり、NULLを含めることができます。これにより、strlenの長さが正しくなくなります。

7
Charles Salvia
BYTE *str1 = "Hello World";
std::string str2((char *)str1);  /* construct on the stack */

代わりに:

std::string *str3 = new std::string((char *)str1); /* construct on the heap */
cout << &str3;
delete str3;
4
spoulson

BYTEはtypedef unsigned char BYTE;に他なりません

以下のコンストラクタを簡単に使用できます

string ( const char * s, size_t n );
string ( const char * s );
2
Satbir

CryptoPPにアクセスできる場合

読み取り可能な16進文字列から符号なし文字へ

std::string& hexed = "C23412341324AB";
uint8_t      buffer[64] = {0};
StringSource ssk(hexed, true,
            new HexDecoder(new ArraySink(buffer,sizeof(buffer))));

帰ってきた

std::string hexed;
uint8_t val[32]  = {0};
StringSource ss(val, sizeof(val), true,new HexEncoder(new StringSink(hexed));
// val == buffer
0
user2195463