Hallo, ich bekomme aus einem Gerät z.B die folgenden Hex Strings: 5E357F welchen ich umwandeln muss in 7F355E und dann als Dezimalzahl (String) ausgeben also 8336734. Wie kann ich dies möglichst einfach konvertieren? Grüße tim
:
Verschoben durch User
tim0304 schrieb: > Hallo, > > ich bekomme aus einem Gerät z.B die folgenden Hex Strings: Hmm. Das ist missverständlich ausgedrückt. Wahrscheinlich bekommst du vom Gerät erst mal einen Text. Der könnte genausogut auch "Hugo" sein oder "Tante Emma". Bei dir ist er halt "5E357F". Aber es ist erst mal nur ein Text. Bestehend aus einzelnen Zeichen. Wobei jedes Zeichen aus dem Vorrat stammt, das man zur Darstellung von Hexadezimalzahlen benötigt. > 5E357F welchen ich umwandeln muss in 7F355E und dann als Dezimalzahl > (String) ausgeben also 8336734. Warum musst du den Text erst mal entsprechend verwürfeln? Wenn du dir einfach immer 2 aufeinanderfolgende Zeichen rauspickst, die als 2 stellige Hex-Zahl interpretierst und dann die 3 Einzelteile entsprechend korrekt zusammenbaust, tut es das doch auch.
1 | 5E357F |
2 | |
3 | "5E" -> umbauen zu numerisch 0x5E |
4 | "35" -> umbauen zu numerisch 0x35 |
5 | "7F" -> umbauen zu numerisch 0x7F |
6 | |
7 | (unsigned long)0x7F << 16 + 0x35 << 8 + 0x5E |
man kann natürlich den Text auch entsprechend verwürfeln. Aber dann braucht man immer noch eine Funktion, die aus "7F355E" die entsprechende Zahl generieren kann. strtol() zb könnte das.
1 | decoded[0] = original[4]; |
2 | decoded[1] = original[5]; |
3 | decoded[2] = original[2]; |
4 | decoded[3] = original[3]; |
5 | decoded[4] = original[0]; |
6 | decoded[5] = original[1]; |
7 | decoded[6] = '\0'; |
8 | |
9 | number = strtol( decoded, NULL, 16 ); |
dann hast du in number das numerishe Äquivalent und kannst damit machen was du willst. Zum Beispiel ausgeben. Edit: Tut mir leid. Ich hab das C# überlesen. Aber so oft kommt das nicht vor, dass sich jemand mit so einer C# Frage hier her verirrt. So etwas ist eine klassische C Frage, die pro Woche 25 mal auftaucht.
:
Bearbeitet durch User
Moin, wenn es wirklich um C# geht und die Länge deines String immer 6 ist, dann würd ich das als ersten Schuß so machen
1 | string foo = "7F355E"; |
2 | string bar = foo.Substring(4, 2) + foo.Substring(2, 2) + foo.Substring(0, 2); |
3 | int x = Convert.ToInt32(bar, 16); |
Es wurden ja schon einige Ansätze genannt; hier mal eine andere Idee:
1 | using System; |
2 | using System.Globalization; |
3 | using System.Net; |
4 | |
5 | // ...
|
6 | |
7 | int Foo(string hex) |
8 | {
|
9 | if (hex.Length != 6) throw new ArgumentException(); |
10 | |
11 | int dec = int.Parse(hex + "00", NumberStyles.HexNumber); |
12 | return IPAddress.NetworkToHostOrder(dec); |
13 | }
|
R. Rebentrost schrieb: > Es wurden ja schon einige Ansätze genannt; hier mal eine andere Idee: Falls die Verwürflung nicht einfach nur Big- und Little-Endian ist, ginge z.B.: var dec = int.Parse(hex, NumberStyles.HexNumber); var dec_byte_array = BitConverter.GetBytes(dec); mach_was_mit_den_bytes_im_array(); var res = BitConverter.ToInt32(dec_byte_arry);
Moin, erstmal vielen Dank für die vielen Hinweise. Ich habe das Problem vielleicht etwas undeutlich beschrieben. Die Strings sind unterschiedlich lang. Und es handelt sich tatsächlich um Little - Big Indian Verwürfelung. Das dürfte die Sache vereinfachen oder?
tim0304 schrieb: > Moin, > > erstmal vielen Dank für die vielen Hinweise. Ich habe das Problem > vielleicht etwas undeutlich beschrieben. Die Beschreibung ist noch immer lückenhaft ... Wie lang kann/soll der String maximal sein (ich nehme an, 16 Zeichen)? Kommt er immer in Zeichenpaaren (Prefix 0, wenn jeweils einstellig, also z.B. "0F", "07AB", "010203") oder auch als "1", "F", "7F2" etc.?
Hier eine Lösung in Ausführlich:
1 | string text = "5E357F"; |
2 | |
3 | long result = 0; |
4 | |
5 | for( int n = 0; ; n++ ) |
6 | { |
7 | if( n * 2 + 2 > text.Length ) |
8 | break; |
9 | |
10 | string sub = text.Substring( n * 2, 2 ); |
11 | long val = long.Parse( sub, System.Globalization.NumberStyles.HexNumber ); |
12 | |
13 | result += val << ( n * 8 ); |
14 | } |
15 | |
16 | // Ergebnis in 'result' |
und hier in Kurz:
1 | string text = "5E357F"; |
2 | |
3 | long result = 0; |
4 | |
5 | for( int n = 0; n * 2 + 2 <= text.Length; n++ ) |
6 | result += long.Parse( text.Substring( n * 2, 2 ), System.Globalization.NumberStyles.HexNumber ) << ( n * 8 ); |
7 | |
8 | // Ergebnis in 'result' |
Gruß Basti
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.