2017-03-31 66 views
0

之前(使用ASCII)我使用的std :: string如緩衝這樣的:C++附加的int wstring的

std::string test = ""; 
int value = 6; 
test.append("some string"); 
test.append((char*)value, 4); 
test.append("some string"); 

在測試預期值:

「一些srtring \ 5233 \ X0 \ X0 \ x0somestring」

現在我特林使用Unicode,我想保持相同的 「碼」,但trubles發生:

std::wstring test = ""; 
int value = 6; 
test.append("some string"); 
test.append((wchar_t*)value, 4); (buffer overflow cause reading 8 bytes) 
test.append("some string"); 

我該如何在std :: string中添加字節? 做:

std::wstring test = ""; 
int value = 6; 
test.append("some string"); 
test.append((wchar_t*)value, 2); 
test.append("some string"); 

解決部分問題原因後,我不能追加的bool。

編輯: 如果採用二進制副本我甚至可以使用wstringstream(通常不是)

+3

只要翻轉到'std :: wstring',就不會「使用Unicode」。 –

+1

爲什麼不使用'std :: to_string'和'std :: to_wstring'? (並使用'+'作爲concat) – pergy

+0

強制轉換通常是一個糟糕的主意。 C型演員通常是一個更糟糕的主意。如果你使用了C++類型轉換,你會發現'static_cast (value)'不會被編譯。通常,'static_cast'至少是安全的。通過不編譯,至少你可能會被阻止嘗試像這樣。 '(char *)value'獲取字節並將它們重新解釋爲字符。你確定這就是你真正想要的嗎?當然不是,但演員並沒有告訴你,像'reinterpret_cast'一樣。 – chris

回答

0

你讓一個函數讀取你想要把東西:

void putBytes(std::wstring& s, char* c, int numBytes) 
{ 
    while (numBytes-- > 0) 
     s += (wchar_t)*c++; 
} 

然後你就可以叫它:

int value = 65; 
putBytes(s, reinterpret_cast<char*>(&value), sizeof(value)); 
0

我認爲的IStream就是做這個正確的方法......我會讓一個接口來處理不同的類型。我被濫用的std :: string一種簡單的「動態二進制數組」,用的std :: wstring的,這是不可能的,原因是多方面的,但最傻的一個是,至少需要2個字節,所以沒有餘地布爾

1

你在混淆unicode和character encodings。使用UTF-8編碼,std::string可以很好地表示unicode代碼點。

Windows使用UTF-16LE(或UTF-16以BOM,相信)編碼來表示的unicode字形。大多數人使用UTF-8。

一種std::string其在UTF-8編碼和僅使用ASCII字符實際上可以被解釋爲ASCII字符串。這是UTF-8的美妙之處。這是一個自然的延伸。

反正

我需要一個 「二進制」 動態緩衝器,其中i可以添加的類型的實際尺寸(布爾1,中間體4等)

一個std::vector<uint8_t>可能是更合適的爲此任務。它表示它本身不是人類可讀的東西。如果您需要將字符串嵌入到此緩衝區中,請確保平臺上的sizeof(char) == sizeof(uint8_t),然後將數據原樣寫入此緩衝區。

如果你節省一臺機器上這個緩衝區,並嘗試閱讀另一臺機器上,你必須採取的endianness照顧了。

+0

感謝您的澄清。我會進一步搜索。 – Ixiodor