防止操作符插入到字符串流中

时间:2018-02-14 12:05:27

标签: c++ stringstream

免责声明:我对C ++很可怕;

我使用wstringstream从矢量中获取对象,并将其值格式化为可以存储在文件映射中的字符串。 (对于IPC)。

std::wstringstream ss;
SDLWrap::frame obs = SDLWrap::getObs();
for (int i = 0; i < obs.pixels.size(); i++ )
{
    SDLWrap::pixel p = obs.pixels[i];
    ss << "{" << p.x << "," << p.y << "," << p.r << "," << p.g << "," << p.b << "}";
}
MemFile::writeMemData(TEXT("Local\\ReflexAIOut"), ss.str(), ss.str().length()*2);

将字符串转换为字符数组(WCHAR),然后将其放入内存中。似乎运算符也包含在字符串中,因为最终结果包括3个NUL char代替运算符。

<mmap.mmap object at 0x00000185F9A8CF30>
b'{\x000\x00,\x000\x00,\x000\x00,\x000\x00,\x000\x00}\x00{\x000\x00,\x001\x00,\x000\x00,\x000\x00,\x000\x00}\x00{\x000\x00,\x002\x00,\x000\x00,\x000\x00,\x000\x00}...

是否有一种简单的方法可以在不包含运算符的情况下连接这些值?我想避免另外一个循环去除额外的NUL字符。

编辑:这里是writeMemData函数

bool MemFile::writeMemData(std::wstring memName, std::wstring data, int size)
{
    HANDLE mapFile;
    LPCTSTR buff;

    mapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,
        NULL,
        PAGE_READWRITE,
        0,
        size,
        memName.c_str());

    if (mapFile == NULL)
    {
        return false;
    }

    buff = (LPTSTR)MapViewOfFile(mapFile,
        FILE_MAP_ALL_ACCESS,
        0,
        0,
        size);

    if (buff == NULL)
    {
        return false;
    }

    CopyMemory((PVOID)buff, data.c_str(), (_tcslen(data.c_str()) * sizeof(TCHAR)));

    UnmapViewOfFile(buff);
    openMem_.push_back(mapFile);
}

1 个答案:

答案 0 :(得分:3)

您正在写入std::wstringstream,这是 wide (在您的情况下为16位或2字节*)字符的流。因此,对于放入该流的每个1字节char,出现2字节wchar_t

ss << "{" << p.x << "," << p.y << "," << p.r << "," << p.g << "," << p.b << "}";
//     |     |       |     |       |     |       |     |       |     |       |
//     {\x00 0\x00   ,\x00 0\x00   ,\x00 0\x00   ,\x00 0\x00   ,\x00 0\x00   }\x00

那些NUL字节是2字节对的高字节。

如果您希望数据以8位编码进行编码,请使用std::stringstream代替std::wstringstream

* - 标准没有定义确切的wchar_t大小。