3

我想在通过流发送之前将wchar_t变量转换为 a 。BYTE *

我有

wchar_t val[] = L"abc";

我尝试使用:

BYTE * bytes = (BYTE *)val;

读取字节时,我没有所有字符;我只有第一个字符-"a"

我想,我转换得不好wchar_t

我究竟做错了什么?

编辑 :

static void DASH_process_receive(rdpSvcPlugin* plugin, wStream* data_in)
    int bytes;
    wStream* data_out;
    DASHPlugin* DASH = (DASHPlugin*) plugin;

    fprintf(stderr, "DASH_process_receive:\n");

    if (!DASH)
    {
        fprintf(stderr, "DASH_process_receive: DASH is nil\n");
        return;
    }

    /* process data in (from server) here */
    /* here we just send the same data back */

    bytes = Stream_Capacity(data_in);
    fprintf(stderr, "DASH_process_receive: got bytes %d\n", bytes);


       wchar_t val[] = L"abc";
       bytes = Stream_Capacity(data_in);

    if (bytes > 0)
    {

        fprintf(stderr, "size wcslen val  %zd\n", wcslen(val));

        fprintf(stderr, "size of val  %zd\n", sizeof(val)); //I Have 16

        data_out = Stream_New((BYTE*)val, sizeof(val));


        Stream_Copy(data_out, data_out,sizeof(val));

        /* svc_plugin_send takes ownership of data_out, that is why
           we do not free it */

        bytes = Stream_GetPosition(data_out);
        fprintf(stderr, "DASH_process_receive: sending bytes %d\n", bytes);

        svc_plugin_send(plugin, data_out);
}

    Stream_Free(data_in, TRUE);
}

编辑:读取数据

WTSVirtualChannelRead(VirtChannelParamsStart, 20000, (PCHAR)Message, sizeof(Message), &ulBytesRead))

unsigned short Message[1024];
CString paramsPourStarter;
paramsPourStarter = Message;
SetDlgItemText(IDC_ED_DASH_RESU,paramsPourStarter);
4

2 回答 2

5

你怎么读的长度bytes

如果sizeof(wchar_t) == 2(假设你在一个小端主机上运行)指向的数据byte看起来像

{'a', '\0', 'b', '\0', 'c', '\0', '\0', '\0'}

所以strlen会在遇到空字符后立即停止计算它的长度'a'

当您转换wchar_t数组时,您还应该使用计算它的长度wcslen

BYTE * bytes = (BYTE *)val;
size_t len = wcslen(val) * sizeof(val[0]);
// pass len to any functions which are passed bytes
于 2013-06-14T09:12:19.707 回答
3

转换很好,我假设您发送了正确的字节数。sizeof(val)假设这wchar_t是一个 2 字节的 UTF-16 字符,可以在您的问题中找到和等于 8 的代码。或者,如果您wchar_t是 4 字节 UTF-32 字符,则为sizeof(val)16。

问题将出现在另一端,即读取数据的代码中。我可以想象三种明显的故障模式:

  1. 您无法读取整个缓冲区。也许您假设内容为空终止并读取到第一个零字节。这是不正确的,因为 nullwchar_t实际上是两个零字节。
  2. 您正确读取了整个缓冲区,但您将数据解释为char*而不是wchar_t*.
  3. 您正确读取数据并将其正确解释为wchar_t*. 但是wchar_t发送方是 UTF-32,接收方是 UTF-16。这意味着当数据实际上是 UTF-32 时,您会将数据解释为 UTF-16。

这些解释中的任何一个都可以解释为什么您只收到第一个字符。

无论如何,我认为您以错误的方式解决问题。您可能不应该通过网络传递 UTF-16/UTF-32。对文本使用面向字节的编码会更好,自然选择是 UTF-8。

更新

您的更新使发生的事情更加清楚。您通过网络发送 UTF-32 数据,然后将该数据解释为 UTF-16(假设您的 Windows 程序是 Unicode 程序)。这种不匹配导致数据被错误解释,并解释了为什么您只收到第一个字符。就是上面的第 3 项。

为了解决这个问题,您需要非常清楚您的文本是如何编码的。您可以通过以下事实来观察您遇到的基本问题:您的问题中没有任何地方谈论文本编码。如果你想在不同的程序之间传递数据,你需要就通用的文本编码达成一致。同样,我建议您将 UTF-8 编码的文本放在网络上。

您还有一个问题,即您假设文本是以空结尾的。如果你有一个传输错误,那么你的接收程序有一个缓冲区溢出。您需要解决的另一个问题是字节序。您需要所有各方就网络上的数据达成共同的字节顺序。使用网络字节顺序。

于 2013-06-14T12:06:13.107 回答