我通过C ++中的命名管道发送消息“abc”(为简洁起见编辑):
LPWSTR message = TEXT("abc");
hPipe = CreateFile( // Type: HANDLE
lpszPipename, // pipe name
GENERIC_READ | // read and write access
GENERIC_WRITE,
0, // no sharing
NULL, // default security attributes
OPEN_EXISTING, // opens existing pipe
0, // default attributes
NULL); // no template file
dwMode = PIPE_READMODE_MESSAGE; // DWORD
SetNamedPipeHandleState(
hPipe, // pipe handle
&dwMode, // new pipe mode
NULL, // don't set maximum bytes
NULL); // don't set maximum time
cbToWrite = (lstrlen(message) + 1)*sizeof(TCHAR); // DWORD
_tprintf(TEXT("%d bytes %s."), cbToWrite, message); // Displays: 8 bytes abc.
WriteFile(
hPipe, // pipe handle
message, // message
cbToWrite, // message length
&cbWritten, // bytes written
NULL); // not overlapped
并从C#收到此消息:
NamedPipeServerStream pipeStream = new NamedPipeServerStream(
PIPE_NAME,
PipeDirection.InOut,
NamedPipeServerStream.MaxAllowedServerInstances,
PipeTransmissionMode.Message
);
int count = pipeStream.Read(buffer, 0, 1024);
string message= System.Text.Encoding.UTF8.GetString(buffer, 0, count); // Same with UTF32
Console.OutputEncoding = System.Text.Encoding.Unicode;
Console.WriteLine("-" + message+ "-"); // Displays -a b c -
问题:收到的message
为"a\0b\0c\0\0\0"
而不是“abc”。
我做错了什么?我在C ++ / C#上搜索了所有关于Unicode的技巧,但没有用。
答案 0 :(得分:6)
你所拥有的是每个字符编码2个字节,即16位Unicode。这与UTF8不同。 UTF8根据需要使用尽可能多的字节,因此简单' a'是一个字节,但一些中国符号可以采取例如4个字节。
您需要使用Unicode编码:
string result = Encoding.Unicode.GetString(buffer, 0, count);
请注意,这会给你' abc \ 0'字符串,所以会有空终止,但这是正确的。