免责声明:我对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);
}
答案 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
大小。