C# Hex String 2 Bytes tauschen und in Dez. ausgeben

#4179122
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.
Gast #4179134
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);
Gast #4179172
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
  }
Gast #4179739
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?
Gast #4179901
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.?
#4180299
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren