簡體   English   中英

如何在C中將wchar_t轉換為BYTE *

[英]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。

然后問題出在另一端,即讀取數據的代碼。 我可以想象三種明顯的失敗模式:

  1. 您無法讀取整個緩沖區。 也許您假設內容為空終止並讀取到第一個零字節。 這是不正確的,因為null wchar_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編碼的文本放在線路上。

您還有一個問題,即您假設文本以空值終止。 如果您有傳輸錯誤,那么您的接收程序會有緩沖區溢出。 你需要掌握的另一個問題是字節序。 您需要所有各方就線路上的數據達成共同的字節順序。 使用網絡字節順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM