[英]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服務分配了它? 此外, consatDataSize
是consatDataSize
的大小還是Web服務讀取的字節數?
看看是否可以分配緩沖區,以便您有空間在最后自己添加空終止符。 如果您控制緩沖區的大小(也就是說,如果您自己分配緩沖區並只是要求Web服務寫入該緩沖區),則只需分配一個額外的字節並在Web服務告訴您緩沖區有多少字節后向其寫一個空值即可。書面。 否則,我無法想象服務不會以空值終止其自己的字符緩沖區……也許您沒有給它足夠的存儲空間?
然后,要將其轉換為字符串,請遵循此StackOverflow線程 。 至少有兩個建議的解決方案:創建一個包含未簽名字符的std::string
(這可能會導致兼容性問題),或者將您的未簽名字符轉換為已簽名字符,並創建純jane std::string
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.