从C ++到C#经过命名管道后,字符串“abc”变为“a \ 0b \ 0c \ 0”

时间:2016-03-07 09:13:49

标签: c# c++ unicode visual-studio-2015 named-pipes

我通过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的技巧,但没有用。

1 个答案:

答案 0 :(得分:6)

你所拥有的是每个字符编码2个字节,即16位Unicode。这与UTF8不同。 UTF8根据需要使用尽可能多的字节,因此简单' a'是一个字节,但一些中国符号可以采取例如4个字节。

您需要使用Unicode编码:

string result = Encoding.Unicode.GetString(buffer, 0, count); 

请注意,这会给你' abc \ 0'字符串,所以会有空终止,但这是正确的。