2012-11-16 41 views
1

我在C#編寫的一個小插座的應用程序,在每一個當前版本我的程序的檢查開始,現在我的這一切測試程序的工作,我可以從服務器發送字符串,它會在客戶端上正常顯示,但是當我試圖if語句採用與字符串它是行不通的。例如:C#後,就可以閱讀,但不與正常工作,「如果」

public void rcv(NetworkStream ns, TcpClient clientSocket) 
    { 
     on = false; 
    //sending some random string so the server will respond 
     Byte[] sendBytes = Encoding.ASCII.GetBytes("bla"); 
     ns.Write(sendBytes, 0, sendBytes.Length); 
    //receiving server response 
     byte[] bytes = new byte[clientSocket.ReceiveBufferSize]; 
     int bytesread = clientSocket.ReceiveBufferSize; 
     ns.Read(bytes, 0, bytesread); 
    //received response, now encoding it to a string from a byte array 
     string returndata =Encoding.ASCII.GetString(bytes); 
     ver = Convert.ToString(returndata); 
     //MessageBox.Show("ver\n" + ver); 
     //MessageBox.Show("return\n" + returndata); 
     on = true; 
     if (ver== "2.0.1") 
     { 
      MessageBox.Show("iahsd"); 
     } 
    } 

因此,大家可以看到,使用該測試字符串IM是由服務器發送的是「2.0.1」確實不正常顯示一個標籤,一個消息框,我把一個文本框上進行測試。但是在課程末尾的if分支不接受它並跳過它,如果我放入一個else語句,它跳到那個。

我已經試過各種我和我的朋友們能想到的,試圖改變編碼,發送不同的字符串,等等。

客戶端的全碼: http://pastebin.com/bQPghvAH

+0

實際上難以在if上加上斷點,並檢查ver變量中的值是什麼 – Steve

+0

看到某些人對事物的看法總是很有趣。當'returndata'已經被定義爲一個'string'時,你認爲調用'Convert.ToString(returndata);'會做什麼? –

+0

@Steve版本的值是正確的琴絃,在這種情況下,「2.0.1」,但它不工作.. 我前右如果早期版本 的值設置爲一個文本框|||||| \t \t \t \t Damien_The_Unbeliever老實說,我只是圍繞着最不可思議的東西,嘗試絕望到底,我知道,不作任何SENCE,但問題本身didnt任何意義,我要麼 – Alex

回答

1

的「2.0.1」在你的代碼中編譯時存儲爲Unicode。 http://msdn.microsoft.com/en-us/library/362314fe(v=vs.110).aspx

你是治療從服務器爲ASCII編碼的文本值,然後相對於一個Unicode字符串。

觀察:

static void Main(string[] args) 
    { 
     string a = "hello"; 
     byte[] b = UnicodeEncoding.Unicode.GetBytes(a); 
     string c = ASCIIEncoding.ASCII.GetString(b); 

     Console.WriteLine(a == c); 
    } 

的解決方案是使用String.Compare ...

Console.WriteLine(String.Compare(a,c)==0); 
+0

我希望能夠與代碼藏漢使用字母,這就是爲什麼我選擇了一個字符串,我已經嘗試過了編碼爲Unicode,雖然,它沒有工作,要麼 – Alex

+0

如果你在代碼兩個變量都被定義爲中鍵入'string',那麼它們都將包含Unicode字符串。無關緊要的是它們中的一個來自一系列字節並被翻譯成這些字節是ASCII。 –

+0

Unicode字符串'2.0.1'應該是相同的ASCII字符串'2.0.1' – jgauffin

1

Stream.Read(...)返回讀取的字節數。您需要使用此值來確定您的字符串在哪裏結束,通過使用Encoding.GetString(Byte[] bytes, Int32 index, Int32 count)過載。

Byte[] buffer = ...; 
var bytesRead = stream.Read(buffer, 0, buffer.Length); 
var returnedData = Encoding.ASCII.GetString(buffer, 0, bytesRead); 
相關問題