[英]How to cast a wchar_t to a BYTE* in C
我想在通過流發送之前將wchar_t
變量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);
你是如何讀取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
轉換很好,我假設您發送正確的字節數。 假設wchar_t
是一個2字節的UTF-16字符,可以找到sizeof(val)
和等於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編碼的文本放在線路上。
您還有一個問題,即您假設文本以空值終止。 如果您有傳輸錯誤,那么您的接收程序會有緩沖區溢出。 你需要掌握的另一個問題是字節序。 您需要所有各方就線路上的數據達成共同的字節順序。 使用網絡字節順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.