2011-12-08 15 views
5

Tworzę aplikację formularzy to Visual C#. Mam pole tekstowe, w którym użytkownik musi wprowadzić liczbę i wielką literę, na przykład "9D".Ciąg dosłownie do bajtu

Co muszę zrobić, to umieścić ten list do tablicy bajtów jako bajt ... więc w moim tablicy bajtów byłoby:

array[index] = 0x9D 

wiem, że klasa tekstowe reprezentuje 9D jako ciąg . Jestem zdezorientowany, jak zrobić go w dosłownym bajcie (9D) i włożyć go do tablicy.

Nowości w .Net, więc każda pomoc byłaby doceniana. Przyjrzałem się klasie System.Convert i nie widziałem niczego, czego mógłbym użyć.

+0

zakładam chcesz traktować 0x9D ma 157 poprawny? –

+0

Tak, to prawda. – brazc0re

+0

Możesz użyć metody [System.Convert.ToByte] (http://msdn.microsoft.com/en-us/library/c7xhf79k.aspx), podaj '16' jako bazę do konwersji łańcuchów Hex na bajty. – pstrjds

Odpowiedz

6

Zastosowanie Byte.Parse(string, NumberStyles):

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

Albo Byte.TryParse(string, NumberStyles, IFormatProvider, out Byte) bardziej wdzięcznie obsłużyć nieprawidłowe dane.

+0

Dziękuję. Byte.Parse (text, NumberStyles.HexNumber) zrobił dokładnie to, co chciałem! – brazc0re

+2

@ brazc0re - Sugeruję, abyś używał TryParse, w przeciwnym razie twoja aplikacja WYKRACZA, jeśli ciąg nie może zostać przekonwertowany na numer bazowy 16. –

+0

Dziękuję za propozycję Ramhound. Użyję zamiast tego TryParse i poradzę sobie z błędami przy próbie, złap się odpowiednio. – brazc0re

1

Użyj polecenia Byte.Parse, aby przeanalizować ciąg znaków w postaci Byte.

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

Należy pamiętać, że o prefiks 0x spowoduje parse nie, więc może chcesz rozebrać ją, jeśli istnieje.

+0

Dzięki! To rozwiązanie działało również. – brazc0re

4

Jeśli chcesz zrobić to trochę szybciej i pozwolić '0x' przed numerem, możesz użyć Convert.ToByte("0x9D", 16). W moich ograniczonych testach numer Convert.ToByte był dwa razy szybszy niż Byte.Parse

Można również sprawdzić poprawność danych wejściowych za pomocą prostego Regex. W ten sposób wiesz, że ciąg będzie analizowany przed wywołaniem dowolnej metody do parsowania lub konwersji.

// 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}$") 

kod Test:

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; 
Powiązane problemy