ostringstream — конвертирует массив uint8_t в строку в переполнении стека

У меня есть массив типа uint8_t. Я хочу создать строку, которая объединяет каждый элемент массива. Вот моя попытка использовать ostringstream, но после этого строка кажется пустой.

std::string key = "";
std::ostringstream convert;
for (int a = 0; a < key_size_; a++) {
convert << key_arr[a]
key.append(convert.str());
}

cout << key << endl;

2

Решение

Попробуй это:

std::ostringstream convert;
for (int a = 0; a < key_size_; a++) {
convert << (int)key[a];
}

std::string key_string = convert.str();

std::cout << key_string << std::endl;

ostringstream класс похож на строителя строк. Вы можете добавить значения к нему, и когда вы закончите, вы можете вызвать его .str() способ получить std::string это содержит все, что вы положили в него.

Вам нужно разыграть uint8_t значения для int прежде чем добавить их в ostringstream потому что, если вы этого не сделаете, он будет рассматривать их как символы. С другой стороны, если они представляют символы, необходимо удалить (int) бросить, чтобы увидеть реальных персонажей.


РЕДАКТИРОВАТЬ: Если ваш массив содержит 0x1F 0x1F 0x1F, и вы хотите, чтобы ваша строка была 1F1F1F, вы можете использовать std::uppercase а также std::hex манипуляторы, вот так:

std::ostringstream convert;
for (int a = 0; a < key_size_; a++) {
convert << std::uppercase << std::hex << (int)key[a];
}

Если вы хотите вернуться к десятичной и строчной букве, вам нужно использовать std::nouppercase а также std::dec.

3

Другие решения

Это работает для меня:

#include <string>
#include <iostream>

int main()
{

uint8_t arr[] = {'h', 'i'};

std::string s;

s.assign(arr, arr + sizeof(arr));

std::cout << s << '\n';
}

Вы также можете использовать конструктор строки:

std::string s(arr, arr + sizeof(arr));
3

По вопросам рекламы [email protected]