2013-11-05 38 views
3

我有一個問題,通過BitConverter.ToInt32將字節數組轉換爲int32。轉換字節數組爲int32

類型「System.ArgumentException」的未處理的異常出現在mscorlib.dll的

附加信息:目標數組不夠長,所有項目複製>收藏。檢查陣列索引和長度

private void textBox2_TextChanged(object sender, EventArgs e) 
{ 
    byte[] StrToByte = new byte[9]; 
    int IntHexValue;   
    StrToByte = Encoding.UTF8.GetBytes(textBox2.Text); 
    textBox4.Text = BitConverter.ToString(StrToByte); 
    IntHexValue = BitConverter.ToInt32(StrToByte, 0); 
} 
+0

爲什麼你分配一個9字節數組,然後忽略它? (你正在爲'StrToByte'分配一個新的值。)'textBox2.Text'的內容是什麼?這並不完全清楚你想在這裏實現什麼。 –

+0

'textBox2.Text'的值是什麼? –

+1

@SonerGönül,爲什麼?你在尋找其他的shell命令嗎? ':)' – gdoron

回答

7

據推測在textBox2文本的UTF-8表示大於4個字節長少。 BitConverter.ToInt32需要4個字節的數據才能使用。

順便說一句,你不清楚你想達到什麼 - 但是在編碼文本上使用BitConverter.ToInt32很少有用。

而且,在編碼風格方面:

  • 你分配一個新的字節數組,但隨後有效地忽略它
  • 你聲明變量,然後才能在實際使用當中,沒有任何理由。 (理想情況下在第一次使用點聲明變量)
  • 你的變量不遵守.NET命名約定,在那裏他們將與駝峯最好讓更多的含義的指示而不僅僅是類型

所以,即使你的代碼實際上是正確的,這將是更好的寫法如下:

private void textBox2_TextChanged(object sender, EventArgs e) 
{ 
    byte[] encodedText = Encoding.UTF8.GetBytes(textBox2.Text); 
    textBox4.Text = BitConverter.ToString(encodedText); 
    int leadingInt32 = BitConverter.ToInt32(encodedText, 0); 
    // Presumably use the value here... 
} 

(正如我說的,目前還不清楚是什麼你真正想要做的,這就是爲什麼叫leadingInt32 ISN」理想 - 如果我們知道你想要聯繫的意思用值,我們可以使用,在變量名。)

+0

我試圖將字節轉換爲int(如0x31,0x32,0x33爲整數0x7B(1是0x31,2是0x32,3是0x33,123是0x7B)) – user2955372

+0

@ user2955372:但是這裏的文字是什麼?你是否首先閱讀了「BitConverter.ToInt32」的文檔? –

+0

@gdoron:添加了各種風格的筆記。 –

2

原因這個錯誤是BitConverter.ToInt32預計至少4個元素的字節數組,但傳遞到它的的Encoding.UTF8.GetBytes(textBox2.Text)導致,其可以是小於4個字節如果用戶在你的textBox2上輸入了一些簡短的內容,例如「123」,那麼它將只有3個字節。 至於您的方案一種解決方法,你應該墊字節數組至少4個字節長,這樣的事情:

StrToByte = Encoding.UTF8.GetBytes("123"); 

    if (StrToByte.Length < 4) 
    { 
     byte[] temp = new byte[4]; 
     StrToByte.CopyTo(temp, 0); 
     StrToByte = temp; 
    } 

    IntHexValue = BitConverter.ToInt32(StrToByte, 0);