преобразовать массив uint8_t в строку в c ++ - PullRequest
1 голос
/ 28 марта 2020

Это можно пометить как решенное. Проблема была в макросе печати. ESP_LOGx не может создать строки c ++.

Я пытаюсь преобразовать массив uin8_t в строку в c ++. Массив определяется в заголовочном файле следующим образом:

uint8_t mypayload[1112];

Печать самого массива работает, поэтому я уверен, что он не пустой.

Теперь я пытаюсь преобразовать его в строка:

string qrData; 
std::string qrData(reinterpret_cast<char const*>(mypayload), sizeof mypayload);

Я также пытался: qrData = (char*)mypayload;

печать строки приводит к 5 случайным символам.

У кого-нибудь есть подсказка, где я допустил ошибку?

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

Единственный правильный комментарий пока от какого-то программиста, чувак. Так что все кредиты go ему.

Комментарий от Ian4264 совершенно неверный. Конечно, вы можете сделать reinterpret_cast.

Пожалуйста, прочитайте здесь о конструкторах std::string. Вы используете конструктор № 4. Описание:

4) Создает строку с первым количеством символов строки символов, на которые указывает s. s может содержать нулевые символы. Длина строки считается. Поведение не определено, если [s, s + count) не является допустимым диапазоном.

Таким образом, даже если строка содержит 0 символов, C -Style string- «terminator», все байты массивов uint8_t будут скопированы. И если вы напечатаете строку, то она напечатает ВСЕ символы, даже непечатаемые символы после '\ 0'.

Это могут быть ваши "случайные" символы. Поскольку строка после вашего «терминатора», скорее всего, содержит неинициализированные значения.

Вам следует рассмотреть возможность использования конструктора с номером 5

5) Создает строку с содержимым, инициализированным с помощью копия строки символов с нулевым символом в конце, на которую указывает s. Длина строки определяется первым нулевым символом. Поведение не определено, если [s, s + Traits :: length (s)) не является допустимым диапазоном.

И если вам нужно добавить байты, это также возможно. std::string может динамически расти.

Кстати: вы определяете свой двойной тип "std :: string qrData", который не будет компилироваться

0 голосов
/ 28 марта 2020

Поскольку вы знаете размер ваших данных в другой переменной, почему вы используете sizeof? Это даст вам размер массива , а не размер ваших данных .

. Это должно дать вам правильный результат, не допуская других ошибок в вашем коде.

std::string qrData(reinterpret_cast<char const*>(mypayload), data->payload_len);

Кстати, в указанном вами коде почему qrData объявляется дважды? Это кажется немного подозрительным.

...