[英]How to pass std::string to const unsigned char ** in C++
[英]How to Convert unsigned char* to std::string in C++?
我有unsigned char*
,想将其转换为std::string
。 你能告诉我最安全的方法吗?
您只需要将unsigned char
转换为char
因为string
类没有接受unsigned char
的构造函数:
unsigned char* uc;
std::string s( reinterpret_cast< char const* >(uc) ) ;
但是,如果您的字节数组包含空值,则需要在构造函数中使用 length 参数,如果不包含,则只有部分数组会以字符串结尾(数组直到第一个空值)
size_t len;
unsigned char* uc;
std::string s( reinterpret_cast<char const*>(uc), len ) ;
BYTE*
可能是unsigned char*
,但我不能肯定。 如果您告诉我们BYTE
是什么会有所帮助。
如果 BYTE* 是 unsigned char*,则可以使用 std::string 范围构造函数将其转换为 std::string,这将采用两个通用迭代器。
const BYTE* str1 = reinterpret_cast<const BYTE*> ("Hello World");
int len = strlen(reinterpret_cast<const char*>(str1));
std::string str2(str1, str1 + len);
话虽如此,你确定这是个好主意吗? 如果BYTE
是unsigned char
它可能包含非 ASCII 字符,其中可以包括 NULL。 这将使strlen
给出错误的长度。
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;
BYTE 只不过是typedef unsigned char BYTE;
您可以轻松使用以下任何构造函数
string ( const char * s, size_t n );
string ( const char * s );
这是完整的代码
#include <bits/stdc++.h>
using namespace std;
typedef unsigned char BYTE;
int main() {
//method 1;
std::vector<BYTE> data = {'H','E','L','L','O','1','2','3'};
//string constructor accepts only const char
std::string s((const char*)&(data[0]), data.size());
std::cout << s << std::endl;
//method 2
std::string s2(data.begin(),data.end());
std::cout << s2 << std::endl;
//method 3
std::string s3(reinterpret_cast<char const*>(&data[0]), data.size()) ;
std::cout << s3 << std::endl;
return 0;
}
如果可以访问 CryptoPP
可读的十六进制字符串到无符号字符
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.