Zamiana stringa z numerem IP na wartości hex

0

Witam.
Muszę zmienić adres IP na wartość szesnastkową w formacie 192.168.1.100 = 0xC0, 0xA8, 0x01, 0x64 i chciałbym zamienić string na hex...
Adres wpisuje w czterech textboxach, kazdy segment w osobnym textboxie.
W pierwszym textboxie wpisuje wartość 192 i chce otrzymać wartość szesnastkową 0xC0. Poradziłem sobie z tym tak:

string IP1dec= textBox5.Text; //pobieram wartosc z TB
int IP1 = Convert.ToInt32(IP1dec); // zamieniam na int
string hexIP1 = String.Format("{0:X}", IP1); //formatuje na hex
string wlasciwyHEX1 = "0x" + hexIP1;
label1.Text = wlasciwyHEX1;
byte wlasciwyBYTE1 = Convert.ToByte(wlasciwyHEX1);

W label1 otrzymuje pożądany wynik, ale teraz chciałbym wrzucić to do tablicy:

 byte[] tablica = new byte[] { wlasciwyHEX1};

Niestety otrzymuje komunikat

Nieprawidłowy format ciągu wejściowego.

Jak to zrobic? Moze jest na to lepszy/prostszy sposób?

2

Tutaj masz rozwiązany podobny problem z konwersją.

http://stackoverflow.com/questions/321370/convert-hex-string-to-byte-array

3

Zamiast Convert.ToInt32 zrób tam na początku byte.TryParse i problem z głowy.

ps. 0x{0:X2} zamiast {0:X} i pozbędziesz się kolejnej linijki.

0

Mój kod...

 
            string IP1dec = textBox5.Text;
            int decValue = Convert.ToInt32(IP1dec);
            string hexValue = decValue.ToString("X2");
            string wlasciwyHEX1 = "0x" + hexValue;

Już mam wynik w hex, teraz tylko muszę go wrzucić w zdefiniowaną już wcześniej tablicę z innymi "rekordami".

 
            byte[] tablica = new byte[] {  0xff,0xff,0xff,0xff, 
            0x00, 0x00, 0x00, 0x00, wlasciwyHEX1}; 

Ale otrzymuję komunikat

Cannot implicitly convert type 'byte[]' to 'byte'

0

Bo jako element tablicy podajesz tablicę. Elementem tablicy jest byte a podajesz byte[]. Możesz to rozwiązać tak:

byte[] tablica = new byte[] {0xff,0xff,0xff,0xff, 0x00, 0x00, 0x00, 0x00}.Concat(wlasciwyHEX1).ToArray(); 

EDIT:
Jaki typ właściwie ma wlasciwyHEX1. Z kodu wyżej wynika, że string, a z błędu że byte[]. Więc?

0
Sarrus napisał(a):

Jaki typ właściwie ma wlasciwyHEX1. Z kodu wyżej wynika, że string, a z błędu że byte[]. Więc?

No tak, w trakcie pisanie postu próbowałem konwertować na byte... Normalnie na wyjsciu wlasciwyHEX1 jest typu string.

<quote="1052014">
Bo jako element tablicy podajesz tablicę. Elementem tablicy jest byte a podajesz byte[]. Możesz to rozwiązać tak:

byte[] tablica = new byte[] {0xff,0xff,0xff,0xff, 0x00, 0x00, 0x00, 0x00}.Concat(wlasciwyHEX1).ToArray(); 
byte xx = Convert.ToByte(wlasciwyHEX1);
byte[] tablica = new byte[] {xx ,0xff,0xff,0xff, 0x00, 0x00, 0x00, 0x00};

Wszystko ładnie, kompilator sie nie czepia, ale przy wykonaniu kodu

Nieprawidłowy format ciągu wejściowego.

0

Nie rozumiem co kombinujesz. Jeżeli potrzebujesz bajty to po prostu skonwertuj string do byte:

string s = "192";
byte b = Convert.ToByte(s);
Console.WriteLine(b);//192
Console.WriteLine("0x{0:X2}", b); //0xC0
0

Jeszcze raz od początku...
Próbuję wrzucić do tablicy dane koniecznie w hex (tak jak poniżej);

byte[] tablica = new byte[] {0xC0 ,0xff,0xff,0xff, 0x00, 0x00, 0x00, 0x00}; 

Zamieniam dec na hex.

 
int decValue = 192; 
string hexValue = decValue.ToString("X2");
string wlasciwyHEX1 = "0x" + hexValue;// Tu mam wynik wlasciwyHEX1 = 0xC0

Wynikiem tego wszystkiego ma być tablica

byte[] tablica = new byte[] {wlasciwyHEX1 ,0xff,0xff,0xff, 0x00, 0x00, 0x00, 0x00}; 
0

Reprezentacja bedzie taka sama, ale tworząc np taki

 byte[] tablica = new byte[] {0xC0 ,0xff,0xff,0xff, 0x00, 0x00, 0x00, 0x00}; 

ciag danych wysyłam je do karty sieciowej i wszystko działa. Po prostu chcę definiować poszczególne bity w TextBoxach, zapisywać je w tablicy i wysyłać je tak jakbym to w kodzie wpisał. ;)

1

Zapis binarny, oktalny, decymalny i heksadecymalny jest tylko RE-PRE-ZE-NTA-CJĄ liczby. Liczba to liczba. 11000000(2) = 0300(8) = 192(10) = C0(16)
Równie dobrze możesz swoją tablicę utworzyć tak:

byte[] tablica = new byte[] {192 ,255, 255, 255, 0, 0, 0, 0}; 

Będzie to to samo

EDIT do postu wyżej:
No tak ale nie ma sensu konwertować string na liczbę, to na stringa w hex i potem ze stringa do bajta. Skonwertuj stringa do bajta i tyle.
W skrócie:
"192" => 192 => "0xC0" => 192 - czujesz już ten bezsens czy nie?

EDIT2:
Aha i myślę, że masz mylne wyobrażenie że

0xC0 = "0xC0"

Co nie jest prawdą

0

Czyli:
Odczytuje dane z TextBoxa, dane są typu string => konwertuje je na bajty => wrzucam do tablicy i wysyłam?

0

Tak dokładnie.

0

Posłuchałem porad "starszych" i udało się ;)
Wystarczyło

 int IP1_int = Convert.ToInt16(textBox1.Text);
                      byte IP1_byte = Convert.ToByte(IP1_int);
                      byte[] tablica = new byte[] {IP1_byte ,0xff,0xff,0xff, 0x00, 0x00, 0x00, 0x00}; 

Dziękuję za pomoc, pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1