У меня есть неподписанный массив символов, в котором я нуждаюсь в станд.:: строка, но мой текущий путь использует reinterpret_cast, которого я хотел бы избежать. Существует ли более чистый способ сделать это?
unsigned char my_txt[] = {
0x52, 0x5f, 0x73, 0x68, 0x7e, 0x29, 0x33, 0x74, 0x74, 0x73, 0x72, 0x55
}
unsigned int my_txt_len = 12;
std::string my_std_string(reinterpret_cast<const char *>(my_txt), my_txt_len);
Используйте конструктор итераторов:
std::string my_std_string(my_txt, my_txt + my_txt_len);
Это предполагает, что вы хотите, чтобы беззнаковые символы были преобразованы в char. Если вы хотите, чтобы они были переинтерпретированы, то вам следует использовать reinterpret_cast
. Это было бы совершенно чисто, поскольку то, что вы говорите, именно так и делается.
В вашем примере, однако, это не имеет никакого значения, потому что все значения в вашем массиве находятся в диапазоне от 0
до CHAR_MAX
. Поэтому гарантируется, что эти значения представлены в char
так же, как и в unsigned char
, а значит, их переинтерпретация - это то же самое, что и преобразование. Если у вас были значения, превышающие CHAR_MAX
, то реализациям разрешается обращаться с ними по-разному.
Вы пробовали sstream?
stringstream s;
s << my_txt;
string str_my_txt = s.str();