我希望在通过流发送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);
答案 0 :(得分: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
答案 1 :(得分:3)
转换很好,我会假设您发送正确的字节数。假设sizeof(val)
是一个2字节的UTF-16字符,可以找到wchar_t
并且等于8代表问题中的代码。或者,如果您的wchar_t
是4字节的UTF-32字符,则sizeof(val)
将为16。
问题将出现在另一端,即读取数据的代码中。我可以想象三种明显的失败模式:
wchar_t
实际上是两个零字节。char*
而不是wchar_t*
。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编码的文本放在线路上。
您还有一个问题,即您假设文本以空值终止。如果您有传输错误,那么您的接收程序会有缓冲区溢出。你需要掌握的另一个问题是字节序。您需要所有各方就线路上的数据达成共同的字节顺序。使用网络字节顺序。