繁体   English   中英

如何在 C++ 中将 unsigned char* 转换为 std::string?

[英]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);

话虽如此,你确定这是个好主意吗? 如果BYTEunsigned 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM