Forum: PC-Programmierung C# Hex String 2 Bytes tauschen und in Dez. ausgeben


von tim0304 (Gast)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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
von nicht"Gast" (Gast)


Lesenswert?

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);

von R. Rebentrost (Gast)


Lesenswert?

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
  }

von Arc N. (arc)


Lesenswert?

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);

von tim0304 (Gast)


Lesenswert?

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?

von STK500-Besitzer (Gast)


Lesenswert?

Das sollte sich rekursiv machen lassen.

von Eysenaug (Gast)


Lesenswert?

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.?

von Sebastian R. (basti72)


Lesenswert?

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
Noch kein Account? Hier anmelden.