我希望将一个wchar_t
变量转换为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);
sizeof (wchar_t)
是16,我会感到惊讶。sizeof val
可能是16 (sizeof (wchar_t) == 4
,而val
包含4个元素)。val
的前三个元素不为零,所以wcslen(val) == 3
。但是非零的wchar_t
仍然包含 _0-bytes_,因此普通的字符串处理函数认为它在第一个wchar_t
的第一个字节后停止。 - Daniel Fischerval[] = L"abc";
中的L
是什么意思?? - Grijesh Chauhanchar*
处理,这听起来是正确的。如果你查看我回答中val
的内存表示形式,你就会明白为什么会发生这种情况。 - simonc