2012-10-15 61 views
0

以前可能會問這個問題,但是我找不到需要的東西。將無符號字符*緩衝區賦值給一個字符串

我的問題是,我有一個緩衝區加載從web服務下載的數據。緩衝區採用無符號字符*形式,最後沒有'\ 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(); 
} 

波科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) 
+2

我在任何地方都看不到問題。你的問題是什麼? –

+0

的確如此。我可以用不好的方式提出我的問題。我的問題是如何獲得非空字符串結束的數據。 – CppChase

+0

感謝您的問題。請記住,stackoverflow是一個問題和答案網站,而不是問題和解決方案網站。我已在下面回答您的問題。 –

回答

0

這裏有兩個問題:第一,你的緩衝區是不是空終止。其次,它是unsigned char而不是標準char

consatData指向的內存來自哪裏?在從Web服務讀取數據之前分配它,還是Web服務分配它?另外,是consatDataSize緩衝區的大小,還是web服務讀取的字節數?

看看您是否可以分配緩衝區,以便您可以在最後自行添加空終止符。如果你控制了緩衝區的大小(也就是說,如果你自己分配它並且只是要求web服務寫入它),那麼只要分配一個額外的字節並在web服務告訴你它有多少字節時寫入一個空值書面。否則,我無法想象一個服務不會終止它自己的char緩衝區......也許你沒有給它足夠的存儲空間?

然後,將其轉換爲字符串,follow this StackOverflow thread。至少有兩個建議的解決方案:創建一個包含無符號字符的std::string(這可能會導致兼容性問題),或將您的無符號字符轉換爲帶符號的字符並創建一個普通的簡體std::string

+0

好吧,我得到使用curl寫函數返回緩衝區: 爲size_t網址:: _ WRITEFUNCTION(無效* PTR,爲size_t長度size_t nmemb個){ \t INT new_size = BUFFER_SIZE +(尺寸* nmemb個); \t unsigned char * new_buffer = new unsigned char [new_size]; \t memcpy(new_buffer,buffer,buffer_size); \t memcpy(new_buffer + buffer_size,ptr,(size * nmemb)); \t刪除緩衝區; \t buffer = new_buffer; \t buffer_size = new_size; \t return(size * nmemb); } – CppChase

1

我的問題是如何得到這不爲空終止字符串

使用合適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風格的演員陣容。

+0

請參閱我的更新...我添加了valgrind結果。 – CppChase

+0

valgrind的結果表明一些其他的問題妨礙了'consat'析構函數的運行。可能性包括'longjmp()','exit()'或段錯誤。 –

相關問題