簡體   English   中英

將未簽名的char *緩沖區分配給字符串

[英]Assigning unsigned char* buffer to a string

之前可能會問過這個問題,但我找不到我真正需要的東西。

我的問題是,我有一個緩沖區,該緩沖區由從Web服務下載的數據加載。 緩沖區采用無符號char *格式,其中末尾沒有'\\ 0'。 然后我有一個poco xml解析器需要一個字符串。

我嘗試將其分配給字符串valgrind時發現丟失了一些數據。 (見下文)

這是代碼:

DOMParser::DOMParser(unsigned char* consatData, int consatDataSize,
    unsigned char* lagData, int lagDataSize) {

Poco::XML::DOMParser parser;
std::string consat;
consat.assign((const char*) consatData, consatDataSize);
pDoc = parser.parseString(consat);
ParseConsat();
}

Poco xml解析器確實有一個ParseMemory,它需要一個const char *和數據大小,但是由於某種原因,它只會給我帶來分段錯誤。

更新:這是valgrind結果的一部分:

==11880== 12,272 bytes in 1 blocks are possibly lost in loss record 1,126 of 1,143
==11880==    at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255)
==11880==    by 0x4491D05: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc+$
==11880==    by 0x4493F6F: std::string::_M_mutate(unsigned int, unsigned int, unsigned int) (in /usr/lib/libstdc++.so.6.0.13)
==11880==    by 0x4494109: std::string::_M_replace_safe(unsigned int, unsigned int, char const*, unsigned int) (in /usr/lib/libstdc++.$
==11880==    by 0x44941AD: std::string::assign(char const*, unsigned int) (in /usr/lib/libstdc++.so.6.0.13)
==11880==    by 0x804DE03: DOMParser::DOMParser(unsigned char*, int, unsigned char*, int) (DOMParser.cpp:27)

我的問題是如何獲取不為null的數據終止於字符串

使用適當的std::string構造函數,如下所示:

std::string( (const char*) consatData, consatDataSize);

幾乎等效地,使用.assign()方法:

std::string consat;
consat.assign((const char*) consatData, consatDataSize);

我意識到這會引起泄漏等問題。

您認識不正確。 字符串數據被復制到字符串中。 沒有泄漏。

注意:有人可能會說:“ 不要使用C樣式轉換! ”它們可能是正確的。 您可能應該改用reinterpret_cast<const char*>(consatData) 我將C樣式轉換保留在原處,因為它們可以工作,並且因為您的原始代碼使用了它。

這里有兩個問題:首先,您的緩沖區不是空終止的。 其次,它是unsigned char而不是標准char

consatData指向的內存從何而來? 您是在從Web服務讀取數據之前分配了它,還是Web服務分配了它? 此外, consatDataSizeconsatDataSize的大小還是Web服務讀取的字節數?

看看是否可以分配緩沖區,以便您有空間在最后自己添加空終止符。 如果您控制緩沖區的大小(也就是說,如果您自己分配緩沖區並只是要求Web服務寫入該緩沖區),則只需分配一個額外的字節並在Web服務告訴您緩沖區有多少字節后向其寫一個空值即可。書面。 否則,我無法想象服務不會以空值終止其自己的字符緩沖區……也許您沒有給它足夠的存儲空間?

然后,要將其轉換為字符串,請遵循此StackOverflow線程 至少有兩個建議的解決方案:創建一個包含未簽名字符的std::string (這可能會導致兼容性問題),或者將您的未簽名字符轉換為已簽名字符,並創建純jane std::string

暫無
暫無

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

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