2011-12-08 93 views
5

我正在做一個窗體應用程序是Visual C#。我有一個文本框,用戶必須輸入一個數字和一個大寫字母,例如「9D」。字符串文字到字節

我需要做的就是把那封信到一個字節數組作爲一個字節......所以在我的字節數組它會:

array[index] = 0x9D 

我知道,文本框類表示9D作爲一個字符串。我很困惑如何使它成爲一個字面字節(9D)並將其粘貼在數組中。

新的.NET。所以任何幫助將不勝感激。我查看了System.Convert類,並沒有看到任何我可以使用的東西。

+0

我假設你要正確對待0x9D擁有157是否正確? –

+0

是的,這是正確的。 – brazc0re

+0

您可以使用[System.Convert.ToByte](http://msdn.microsoft.com/en-us/library/c7xhf79k.aspx)方法,指定16作爲您的基地將十六進制字符串轉換爲字節。 – pstrjds

回答

6

使用Byte.Parse(string, NumberStyles)

byte b = Byte.Parse(text, NumberStyles.HexNumber); 

或者Byte.TryParse(string, NumberStyles, IFormatProvider, out Byte)以更加妥善地處理無效的輸入。

+0

謝謝。 Byte.Parse(text,NumberStyles.HexNumber)正是我想要的! – brazc0re

+2

@ brazc0re - 我強烈建議您使用TryParse,否則如果字符串無法轉換爲基本16位數字,您的應用程序將會崩潰。 –

+0

謝謝你的建議Ramhound。我將使用TryParse並用try來處理錯誤,並據此進行處理。 – brazc0re

1

使用Byte.Parse將字符串解析爲Byte

array[index] = Byte.Parse("9D", NumberStyles.AllowHexSpecifier); 

注意,具有前綴0x會導致解析失敗,所以你可能想,如果它存在剝離出來。

+0

謝謝!這個解決方案也有效。 – brazc0re

4

如果你想讓它做得更快一點,並允許在數字前面加'0x',你可以使用Convert.ToByte("0x9D", 16)。在我的有限測試中,Convert.ToByteByte.Parse的兩倍

您也可以使用簡單Regex驗證輸入。這樣你就知道在調用任何方法解析或轉換它之前,字符串將解析。

// Checks that the string is either 2 or 4 characters and contains only valid hex 
var regex = new Regex(@"^(0x)*[a-fA-F\d]{2}$") 

測試代碼:

const int count = 100000; 
var data = "9D"; 
var sw = new Stopwatch(); 
sw.Reset(); 

byte dest = 0; 
sw.Start(); 
for(int i=0; i < count; ++i) 
{ 
    dest = Byte.Parse(data, NumberStyles.AllowHexSpecifier); 
} 
sw.Stop(); 
var parseTime = sw.ElapsedMilliseconds; 
sw.Reset(); 
sw.Start(); 
for(int i=0; i < count; ++i) 
{ 
    dest = Convert.ToByte(data, 16); 
} 
sw.Stop(); 
var convertTime = sw.ElapsedMilliseconds;