如何在C中将wchar_t转换为BYTE*

Pis*_*Pis 3 c byte bytebuffer character-encoding

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

我有

wchar_t val[] = L"abc";
Run Code Online (Sandbox Code Playgroud)

我尝试使用:

BYTE * bytes = (BYTE *)val;
Run Code Online (Sandbox Code Playgroud)

我读字节时没有所有字符; 我只有第一个角色 - "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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:读取数据

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

unsigned short Message[1024];
CString paramsPourStarter;
paramsPourStarter = Message;
SetDlgItemText(IDC_ED_DASH_RESU,paramsPourStarter);
Run Code Online (Sandbox Code Playgroud)

sim*_*onc 5

你怎么读长度bytes

如果sizeof(wchar_t) == 2(假设您在小端主机上运行),指向的数据byte将如下所示

{'a', '\0', 'b', '\0', 'c', '\0', '\0', '\0'}
Run Code Online (Sandbox Code Playgroud)

所以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
Run Code Online (Sandbox Code Playgroud)

  • @Pis如果`sizeof(wchar_t)`是16,我会感到惊讶.`sizeof val`可能是16(`sizeof(wchar_t)== 4`,'val`包含4个元素).`val`或非零的前三个元素,所以`wcslen(val)== 3`.但非零的`wchar_t仍然包含_0-bytes_,因此普通的字符串处理函数认为它在第一个`wchar_t`的第一个字节后停止. (2认同)