簡體   English   中英

嘗試將字符串轉換為整數會導致System.FormatException類型的錯誤

[英]Trying to convert a string to integer causes a error of type System.FormatException

我正在為我的服務器制作一個客戶端而且我被卡住了。 我的服務器正在發送Unicode文本,我的客戶端收到它。 問題是這段代碼:

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

我試圖從我的Enum FTPCommands獲取文件, FTPCommands包含服務器發送給我的號碼。 首先我的客戶端收到ID: 1 732847823 (來自調試器的結果)。

它正確分割,在這種情況下: replace[0].ToString() - >“1”並replace[1].ToString() - >“732847823”

沒有錯誤發生!

在第二個命令,客戶端從服務器收到錯誤:

8 Server is too full, try again laiter

它也正確分裂,在這種情況下:

replace[0].ToString() - >“1”並replace[0].ToString() - >“8”並replace[1].ToString() - >“Server”並replace[2].ToString() - >“is”AND replace[3].ToString() - >“too”AND replace[4].ToString() - >“full”,AND replace[4].ToString() - - >“try”並replace[4].ToString() - >“再次”並replace[4].ToString() - >“laiter”

現在錯誤發生了! 我不知道為什么這是使用第一個命令而不是命令8 如果我用數字8替換replace[0].Trim() ,它可以正常工作。 代碼有什么問題,或者什么可能導致錯誤? 是因為我使用的是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
}

編輯(更新):

當Iam使用UTF8作為編碼時,控制台會給我這個結果: CMD,UTF8的轉錄器

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

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

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

編輯:如果null在元素中,則該元素不能轉換為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而不是null,或者在轉換為int之前檢查它是否為null或為空

  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

我不知道為什么你很難將整數轉換為字符串。 您可以直接轉換為枚舉並使用僅包含枚舉值的開關,例如

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;
    }
}

暫無
暫無

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

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