2014-04-25 53 views
0

我正在爲我的服務器製作客戶端,並且卡住了。我的服務器發送Unicode文本,我的客戶端收到它。問題是這樣的一段代碼:嘗試將字符串轉換爲整數會導致System.FormatException類型的錯誤

Enum.GetName(typeof(FTPCommands), Convert.ToInt32(replace[0].Trim())) 

我想從我的枚舉FTPCommands與服務器發過來的號碼獲取文本。首先,我的客戶端收到ID:1 732847823(調試器的結果)。

它分割正確,在這種情況下: replace[0].ToString() - > 「1」 和replace[1].ToString() - >出現 「732847823」

沒有錯誤!

在第二命令中,客戶端從服務器recieving一個錯誤:

8 Server is too full, try again laiter

而且它也正確地分割,在這種情況下:

replace[0].ToString() - > 「1」 和replace[0].ToString() - > 「8」 和replace[1].ToString() - > 「服務器」 和replace[2].ToString() - > 「是」 和replace[3].ToString() - > 「太」 和replace[4].ToString() - > 「全」, 和replace[4].ToString() - > 「嘗試」 和replace[4].ToString() - > 「再次」 和replace[4].ToString() - > 「laiter」

而現在出現錯誤! 我不知道爲什麼這是與第一個命令,而不是命令8。 如果我將replace[0].Trim()替換爲8,那麼它工作正常。 代碼有什麼問題,或者是什麼原因導致了這個錯誤?是因爲我使用Unicode嗎?

下面是我的一些代碼樣本:

NetworkStream stream = client.GetStream(); 
       StreamWriter sw = new StreamWriter(stream, Encoding.Unicode); 
       StreamReader sr = new StreamReader(stream); 
       //SendFileToServer(@"\\fs1\home\manuel.boehmler\contacts.rar", client); 
       AnswerToServer(FTPCommands.ID,null,sw); 
       AnswerToServer(FTPCommands.Username, txtBUserName.Text, sw); 
       AnswerToServer(FTPCommands.Password, txtBPassword.Text, sw); 
       AnswerToServer(FTPCommands.login,null, sw); 
       AnswerToServer(FTPCommands.MaxMbytes, txtBPassword.Text, sw); 

       //AnswerToServer(FTPCommands.FileTransfer,"", sw); 


       string line = null; 
       while (client.Connected == true) 
       { 
        if (!string.IsNullOrEmpty(line = sr.ReadLine()) && line.Length >= 2) 
        { 

         RichTxtMessage("Bekommt: " + line, true); 
         string[] replace = null; 
         string command = ""; 

    replace = line.Split(' '); 
    command = replace[0].ToUpperInvariant(); 

    string arguments = replace.Length > 1 ? line.Substring(replace[0].Length + 1) : null; 

    switch (Enum.GetName(typeof(FTPCommands), Convert.ToInt32(replace[0].Trim())).ToUpperInvariant()) //Error occurs here 
    { 
     case "ID": 
      RichTxtMessage(arguments,true); 
      break; 
     case "ERROR": 
      RichTxtMessage(arguments, true); 
      break; 
    } 
} 

public enum FTPCommands 
{ 

    Persmission = 0, 
    ID = 1, 
    Username = 2, 
    Password = 3, 
    UserNameReq = 4, 
    PasswordReq = 5, 

    Chat = 6, 
    MessageRecived = 7, 
    Error = 8, 
    Warning = 9 
} 

EDIT(UPDATE):

當蔭使用UTF8作爲編碼控制檯給我這個結果回到: CMD, streamwriter with UTF8

正如你可以看到有線符號爲第一個字符。但是,當Iam使用UNICODE時(但仍然無法工作),它並沒有顯示出符號。我解決了這個問題,我不使用任何編碼爲我的FTP服務器

+0

您是否曾嘗試在線上放置斷點並檢查值是您認爲的值(或者如果您不能使用調試器,則將其寫入控制檯)? –

+0

它不太可能是Unicode問題,因爲數字0到9位於ASCII範圍0到127之間,應該在沒有轉換的字符串中進行重新表示。 –

回答

1

而不是Convert.ToInt32(替換[0] .Trim())) 使用int。的TryParse:

int i = 0; 
int.TryParse(replace[0].Trim(), out i) 

編輯:如果空是一個元素,該元素不能轉換爲int和它會拋出錯誤

string arguments = replace.Length > 1 ? line.Substring(replace[0].Length + 1) : null; 

switch (Enum.GetName(typeof(FTPCommands), Convert.ToInt32(replace[0].Trim())).ToUpperInvariant()) //Error occurs here 

分配一些整型而不是空,或者檢查一下是不是空或在轉換爲int之前清空

string arguments = replace.Length > 1 ? line.Substring(replace[0].Length + 1) : "-1"; 

// OR do this 
int opt = 0; 
if (!string.IsNullOrEmpty(replace[0].Trim()) 
opt = int.TryParse(replace[0].Trim(), out opt); 
switch (Enum.GetName(typeof(FTPCommands), Convert.ToInt32(opt)).ToUpperInvariant())  //Error occurs here 
+0

感謝它的工作。我不知道爲什麼Convert.ToInt32()沒有工作。 – C0d1ngJammer

+0

Ok nvm。它也沒有工作。我不知道什麼是從字符串轉換爲int的錯誤。 – C0d1ngJammer

+0

請確認您的替換[0]生成一個有效的字符串,以便將其轉換爲int。確保沒有添加空白。正如你所提到的,如果它在使用trim時正在工作,它會在字符串中留出空白,並且它不能被轉換爲int。所以在將字符串轉換爲int之前使用trim()。確保字符串是1(一),不是l(字母L) – anbuj

1

我不確定爲什麼你很費心將整數轉換爲字符串。你可以轉換爲枚舉值並使用只帶有枚舉值的開關。

int id = -1; 
if (int.TryParse (replace[0].Trim(), id)) 
{ 
    switch ((FTPCommands)id) 
    { 
     case FTPCommands.ID: 
      RichTxtMessage(arguments,true); 
      break; 
     case FTPCommands.Error: 
      RichTxtMessage(arguments, true); 
      break; 
    } 
} 
+0

是的,這是真的,但當我這樣做,我必須鎖定什麼號碼 – C0d1ngJammer

+0

我不明白。該字符串已被轉換爲數字。我節省了您不必將整數轉換爲字符串,然後將其與另一個字符串進行比較。在任何情況下,您提供的代碼都會比較「錯誤」和「錯誤」。 –

+0

Iam抱歉,我放棄添加'.ToUpperInvariant()'。剛剛給你一個upvote,因爲你的解決方案也是正確的。 – C0d1ngJammer

相關問題