簡體   English   中英

在 C++ 中將 uint8_t 數組轉換為字符串

[英]convert uint8_t array to string in c++

這可以標記為已解決。 問題是打印宏。 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 個隨機字符。

有沒有人暗示我在哪里犯了錯誤?

到目前為止,唯一正確的評論來自一些程序員老兄。 所以所有的功勞都歸他所有。

Ian4264 的評論完全錯誤。 當然你可以做一個 reinterpret_cast。

在此處閱讀有關std::string的構造函數的信息。 您正在使用 4 號構造函數。描述是:

4) 用 s 所指向的字符串的前 count 個字符構造字符串。 s 可以包含空字符。 字符串的長度是計數。 如果 [s, s + count) 不是有效范圍,則行為未定義。

因此,即使字符串包含 0 個字符,即 C 樣式字符串 -“終止符”,uint8_t 數組的所有字節也會被復制。 如果你打印字符串,那么它將打印所有字符,甚至是'\0'之后的不可打印字符。

那可能是您的“隨機”字符。 因為“終結符”之后的字符串很可能包含未初始化的值。

您應該考慮使用 5 號構造函數

5) 構造字符串,其內容由 s 指向的以空字符結尾的字符串的副本初始化。 字符串的長度由第一個空字符確定。 如果 [s, s + Traits::length(s)) 不是有效范圍,則行為未定義。

如果需要添加字節,也是可以的。 std::string可以動態增長。

順便說一句:你確實定義了你的“std::string qrData”double,它不會編譯

既然您知道另一個變量中數據的大小,為什么要使用sizeof 它會給你數組的大小,而不是你的數據的大小。

假設您的代碼中沒有其他錯誤,這應該會給您正確的結果

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

順便說一句,在您引用的代碼中,為什么qrData聲明了兩次? 這似乎有點可疑。

qrData = (const char*)mypayload;

string 只接受 const char*。

String s = String((char *)data, len); //esp32

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM