C ++将int附加到wstring

时间:2017-03-31 13:57:00

标签: c++

之前(使用ASCII)我使用std :: string作为缓冲区,如下所示:

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

在测试中具有预期值:

  

“some srtring \ x6 \ x0 \ x0 \ x0somestring”

现在我想使用Unicode,我想保持相同的“代码”,但是发生了变形:

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 个答案:

答案 0 :(得分:1)

你混淆了unicode和character encodings。使用UTF-8编码,std::string可以很好地表示unicode代码点。

Windows使用UTF-16LE(或带有BOM的UTF-16,我相信)编码来表示unicode字形。大多数其他人使用UTF-8。

以UTF-8编码并且仅使用ASCII字符的std::string实际上可以解释为ASCII字符串。这是UTF-8的美丽。这是一个自然的延伸。

反正

  

我需要一个“二进制”动态缓冲区,我可以添加实际大小的类型(bool 1,int 4等)

std::vector<uint8_t>可能更适合此任务。它传达的是,它本身并不是人类可读的东西。如果需要将字符串嵌入此缓冲区,请确保平台上的sizeof(char) == sizeof(uint8_t),然后将数据按原样写入此缓冲区。

如果您将此缓冲区保存在一台计算机上并尝试在另一台计算机上阅读,则还必须处理endianness

答案 1 :(得分: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));

答案 2 :(得分:0)

我认为IStream是一种正确的方法...我会创建一个接口来处理不同的类型。我滥用std :: string作为一个简单的动态二进制数组&#34;,使用std :: wstring这是不可能的,原因很多,但最愚蠢的是需要至少2个字节,所以没有空间一个博尔