全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1524
推到 Plurk!
推到 Facebook!

聊天室中,如何把sever端要傳出去的訊息,轉換成unicode格式傳送出去[續]...

答題得分者是:RaynorPao
leeli
初階會員


發表:57
回覆:55
積分:27
註冊:2003-06-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-27 14:13:26 IP:210.80.xxx.xxx 未訂閱
大大: 今天用此方式測試了一下,又發現了一個奇怪的問題,如果傳送的是一串英文或數字的字串,只會傳送第一個字元。如果是中文字就沒關係。 以下是我的程式碼,能否幫我看看,感激不盡~ void __fastcall TForm1::Button2Click(TObject *Sender) { mode=1; AnsiString sz=Edit4->Text; int iwLen=0; wchar_t wsz[512]={0}; MultiByteToWideChar(CP_ACP, 0, sz.c_str(), -1, wsz, 512); iwLen=(wcslen(wsz) 1)*2; ServerSocket1->Socket->Connections[j]->SendBuf(wsz, iwLen); Edit4->Clear(); }
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。
對於各位的大力協助,感激不盡!
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-27 14:25:25 IP:203.73.xxx.xxx 未訂閱
引言: 大大: 今天用此方式測試了一下,又發現了一個奇怪的問題,如果傳送的是一串英文或數字的字串,只會傳送第一個字元。如果是中文字就沒關係。 以下是我的程式碼,能否幫我看看,感激不盡~ void __fastcall TForm1::Button2Click(TObject *Sender) { mode=1; AnsiString sz=Edit4->Text; int iwLen=0; wchar_t wsz[512]={0}; MultiByteToWideChar(CP_ACP, 0, sz.c_str(), -1, wsz, 512); iwLen=(wcslen(wsz) 1)*2; ServerSocket1->Socket->Connections[j]->SendBuf(wsz, iwLen); Edit4->Clear(); }
leeli 你好: 請問~~你的 client 端是怎麼寫的?? --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
leeli
初階會員


發表:57
回覆:55
積分:27
註冊:2003-06-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-01 09:21:07 IP:210.80.xxx.xxx 未訂閱
Dear: 最近剛好出差所以沒有回應你的問題。 我使用的client的程式兩個都是別人寫的,其中一個我不知道對方的原始碼,另一個列舉如下: void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { Edit3->Text=Socket->ReceiveText(); 兩個程式接到我的訊息所顯現出來的文字都一樣。 請幫我看看問題,感激不盡。
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。
對於各位的大力協助,感激不盡!
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-01 10:26:31 IP:203.73.xxx.xxx 未訂閱
引言: Dear: 最近剛好出差所以沒有回應你的問題。 我使用的client的程式兩個都是別人寫的,其中一個我不知道對方的原始碼,另一個列舉如下: void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { Edit3->Text=Socket->ReceiveText(); 兩個程式接到我的訊息所顯現出來的文字都一樣。 請幫我看看問題,感激不盡。
leeli 你好: 先試著把 Server/Client 端的程式碼,分別改成以下這樣子看看 < class="code"> // Server #define IDENTIFY_STRING "abcd\0" typedef struct _SEND_STRUCT { wchar_t wszIden[10]; wchar_t wszText[1024]; } SEND_STRUCT, *PSEND_STRUCT; //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { SEND_STRUCT ss; ZeroMemory(&ss, sizeof(SEND_STRUCT)); AnsiString szIden=IDENTIFY_STRING; AnsiString szText="測試傳送字串abcdefg"; MultiByteToWideChar(CP_ACP, 0, szIden.c_str(), -1, ss.wszIden, 10); MultiByteToWideChar(CP_ACP, 0, szText.c_str(), -1, ss.wszText, 1024); ServerSocket1->Socket->Connections[0]->SendBuf(&ss, sizeof(SEND_STRUCT)); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { ServerSocket1->Port=4000; ServerSocket1->Open(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { ServerSocket1->Close(); }
// Client
#define IDENTIFY_STRING "abcd\0"
typedef struct _SEND_STRUCT
{
   wchar_t wszIden[10];
   wchar_t wszText[1024];
} SEND_STRUCT, *PSEND_STRUCT;
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
   SEND_STRUCT ss;
   Socket->ReceiveBuf(&ss, sizeof(SEND_STRUCT));       char szIden[10]={0};
   WideCharToMultiByte(CP_ACP, 0, ss.wszIden, -1, szIden, 10, NULL, NULL);
   if(!strcmp(IDENTIFY_STRING, szIden))
   {
      char szText[1024]={0};
      WideCharToMultiByte(CP_ACP, 0, ss.wszText, -1, szText, 1024, NULL, NULL);
      ShowMessage((AnsiString)szText);
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   ClientSocket1->Address="192.168.1.1";
   ClientSocket1->Port=4000;
   ClientSocket1->Open();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
   ClientSocket1->Close();
}
-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
leeli
初階會員


發表:57
回覆:55
積分:27
註冊:2003-06-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-01 11:52:16 IP:210.80.xxx.xxx 未訂閱
Dear: 現在client收到的都是"a" 我並沒有改變client的程式,因為我只是要server把字串轉成unicode格事後傳送出去就可以了。而client不用去理會對方傳什麼過來,只需要把對方傳送過來的字串顯示出來就可以了。 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。
對於各位的大力協助,感激不盡!
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-01 12:32:50 IP:203.73.xxx.xxx 未訂閱
引言: Dear: 現在client收到的都是"a" 我並沒有改變client的程式,因為我只是要server把字串轉成unicode格事後傳送出去就可以了。而client不用去理會對方傳什麼過來,只需要把對方傳送過來的字串顯示出來就可以了。 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
leeli 你好:
(1)client 端收到 "a" 代表 Unicode 字串已經傳過去了
(2)有注意到我上面定義的 structure 嗎?? 實際上在傳輸過程之前的字串會像
   這樣子 "abcd\0測試傳送字串abcdefg\0"
(3)其中前面 5 個 bytes ("abcd\0")是用來做 identify 的,之後的字串才是
   要傳輸的字串內容
(4)但是因為要轉成 Unicode,所以整個資料結構都會變得不一樣了(因為英文字
   ANSI 只佔 1 byte,轉成 Unicode 以後變成佔 2 byte),所以原來的字串
   "abcd\0" 的 ANSI 串流為以下這樣子(16 進位)
   61 62 63 64 00
   被轉成 Unicode 以後的串流為以下這樣子(16 進位)
   61 00 62 00 64 00 64 00 00 00
(5)所以在你的 Client 端如果用 char* 或 AnsiString 去接這個串流的話,當
   然只能看到第 1 個 byte 0x61,因為第 2 個 byte 就是 0x00,就直接截掉
   了(這是 NULL terminated string 的特性)
(6)如果你的 Client 端不配合更改的話,那就在傳送之前先不要轉成 Unicode
   等傳送完成以後,在 Client 端自行轉成 Unicode,這樣問題會簡單許多
(7)如果你還不太了解我在說什麼的話,請參考以下程式碼在 Server 端執行以
   後會產生兩個檔案 ms1.dat, ms2.dat,用 UltraEdit 把這兩個檔案打開,
   好好觀察這兩個檔案的內容,ms1.dat 是 ANSI 的格式,ms2.dat 是Unicode
   的格式,看完以後,你大概就會知道我在說什麼了
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   SEND_STRUCT ss;
   ZeroMemory(&ss, sizeof(SEND_STRUCT));       AnsiString szIden=IDENTIFY_STRING;
   AnsiString szText="測試傳送字串abcdefg";

   TMemoryStream *ms1=new TMemoryStream;
   BYTE bSend[5 512]={0};
   CopyMemory(bSend, szIden.c_str(), szIden.Length() 1);
   CopyMemory(bSend szIden.Length() 1, szText.c_str(), szText.Length() 1);
   ms1->Size=5 512;
   ms1->Write(bSend, ms1->Size);
   ms1->SaveToFile("ms1.dat");
   delete ms1;       MultiByteToWideChar(CP_ACP, 0, szIden.c_str(), -1, ss.wszIden, 5*2);
   MultiByteToWideChar(CP_ACP, 0, szText.c_str(), -1, ss.wszText, 512*2);       TMemoryStream *ms2=new TMemoryStream;
   ms2->Size=sizeof(SEND_STRUCT);
   ms2->Write(&ss, ms2->Size);
   ms2->SaveToFile("ms2.dat");
   delete ms2;    //   ServerSocket1->Socket->Connections[0]->SendBuf(&ss, sizeof(SEND_STRUCT));
}
-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
leeli
初階會員


發表:57
回覆:55
積分:27
註冊:2003-06-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-01 14:35:20 IP:210.80.xxx.xxx 未訂閱
Dear: (1) 我這程式並不是真的要做聊天室的功能。是為了去跟一個硬體溝通。只是因為,那個硬體是走TCP/IP把資訊定期回傳,所以我才會用這種方式來撰寫。並且,我這邊也一樣可以傳命令給硬體,不過因為硬體只接受unicode格式的命令,所以才會衍生出這個問題。 (2) 經過大大的指點,目前問題應該是快解決了。不過,如果我要傳出去的訊息要把前面那個"abcde/o"去掉,是不是指要把#define IDENTIFY_STRING "abcd\0"改為: #define IDENTIFY_STRING "" ??? 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。
對於各位的大力協助,感激不盡!
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-01 14:53:01 IP:203.73.xxx.xxx 未訂閱
引言: Dear: (1) 我這程式並不是真的要做聊天室的功能。是為了去跟一個硬體溝通。只是因為,那個硬體是走TCP/IP把資訊定期回傳,所以我才會用這種方式來撰寫。並且,我這邊也一樣可以傳命令給硬體,不過因為硬體只接受unicode格式的命令,所以才會衍生出這個問題。 (2) 經過大大的指點,目前問題應該是快解決了。不過,如果我要傳出去的訊息要把前面那個"abcde/o"去掉,是不是指要把#define IDENTIFY_STRING "abcd\0"改為: #define IDENTIFY_STRING "" ??? 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
leeli 你好: 改成這樣子應該就可以了吧(建議你自己再試試) < class="code"> // Server void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString szText="測試傳送字串abcdefg"; wchar_t wszText[512]={0}; MultiByteToWideChar(CP_ACP, 0, szText.c_str(), -1, wszText, 512*2); ServerSocket1->Socket->Connections[0]->SendBuf(wszText, 512*2); } -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
leeli
初階會員


發表:57
回覆:55
積分:27
註冊:2003-06-25

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-01 15:26:14 IP:210.80.xxx.xxx 未訂閱
Dear:   如果我要傳送的訊息是不限長度,然後結尾需要以0x02當截止位元時,是否這樣寫就可以呢? : <>>> >>>
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。
對於各位的大力協助,感激不盡!
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-01 16:11:46 IP:203.73.xxx.xxx 未訂閱
引言: Dear: 如果我要傳送的訊息是不限長度,然後結尾需要以0x02當截止位元時,是否這樣寫就可以呢? : <>>> >>>>< face="Verdana, Arial, Helvetica">
leeli 你好:
(1)麻煩下次有問題一次說完,謝謝你的配合
( >
#>
   >>>>>>>>    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
系統時間:2024-05-05 20:47:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!