Autor Beitrag
m.keller
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Do 02.10.14 13:11 
Hallo,

Ich bin gerade an einem neuen Projekt.
Ich habe ein byte[] mit allen möglichen Werten
Nun suche ich mir mit Regex dementsprechend die Daten raus und will diese in ein Single konvertieren.
Da ich im Regex nur Strings verarbeiten kann wird das byte[] dementsprechend Konvertiert.

Das Problem ist Konvertiere ich aus dem byte[] direkt den Single bekomme ich den richtigen wert.
Konvertiere ich aus dem Ergebnis von Regex2 zeigt bekomme ich mittendrin unmögliche Werte.

Mich wundert es sehr weil alle Konvertierungen im ASCII getätigt werden.
Also was mache ich falsch?
Löscht BitConverter irgendwelch Zeichen?
wenn ich mir die Strings anzeigen lasse sehen diese in beiden Regex teilen gleich aus nur die Konvertierten Bytes nicht.
Aber auch nur wenn ich in einem Bereich über 100000 (Messwert) bin, dann zeigt er so etwas wie 168881 an.

Hier mal ein bisschen Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
//im buffer den richtigen String finden und unterteilen für weitere Verarbeitung
  pattern = @"([\s\S]{2})([\s\S]{4})([\s\S]{2})([\s\S]{4})([\s\S]{2})([\s\S]{2})([\s\S]{2})([\w+\s+./\,]+)\0([\w+\s+./\,]+)\0([\w+\s+./\,]+)\0([\w+\s+:./\,\[\]-]+)\0\0\0\0\0([\s\S]+)";
            
input = Encoding.ASCII.GetString(buffer, 0, buffer.Length);
MatchCollection collection = Regex.Matches(input, pattern, RegexOptions.IgnoreCase);

//Suchen der verschieden Felder
foreach (Match m in collection)
{
        wert = m.Groups[12].Value;
}

//Regex2
//im String den richtigen wert finden

pattern = @"([\s\S]+)";
Regex reg = new Regex(pattern, RegexOptions.IgnoreCase);
                            
Match matchRegVec = reg.Match(wert );
                            
ausgabe = BitConverter.ToSingle(Encoding.ASCII.GetBytes(matchRegVec.Groups[0].Value), 14);


Danke schon mal für eure Anregungen.


Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am Do 02.10.2014 um 17:47

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 03.10.14 10:24 
Hallo,

ich muß zugeben, daß ich den Sinn deiner Konvertierungen nicht verstehe (darum habe ich auch gestern abend nicht gleich geantwortet - als ich dieses Thema verschoben hatte).

Wie sieht denn beispielhaft dein byte[]-Buffer aus?

Mit der BitConverter.ToSingle()-Methode wandelst du ja 4 Bytes zu einem Float-Wert um (entsprechend IEEE 754).
Warum du dann jedoch diese Binärdaten nach ASCII verwandelst, um darauf dann den Regex-Ausdruck zu matchen verstehe ich nicht. :nixweiss:
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 06.10.14 07:56 
Hallo,

ich wandel diese, weil der NetStream einige Informationen für mich beinhaltet und ich diese heraus Filtern muss.
z.B. steht in dem letzten Regex bereich dann vier Buchstaben und ab da fangen Messwerte an. Wie viele Messwerte dort auftauchen, steht vorher in dem Stream.(Nur als Beispiel)

Das BitConverter.ToSingle() mir 4 Bytes wandelt ist mir klar.
Nur leider klappt das nicht zuverlässig.
Ich habe es mit dem Original byte[]-Buffer ausprobiert dort erhalte ich leider die selben werte. Somit gehe ich von einem Konvertierungsfehler aus.
Wüsste aber nicht wie ich diesen umgehen soll bzw. kann.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 06.10.14 13:58 
Aber was kann daran falsch sein in ASCII zu wandeln und das dann zu konvertieren?
Der NetStream ist auch laut Hersteller im ASCII Fomat.

Wenn ich folgendes Ausprobiere kommt das richtige heraus:
ausblenden C#-Quelltext
1:
BitConverter.ToSingle(netBuffer,14);					


Und mit diesem im Test nicht:

ausblenden C#-Quelltext
1:
BitConverter.ToSingle(Encoding.ASCII.GetBytes(Encoding.ASCII.GetString(netBuffer)),14);					


Es sei mal dahingestellt ob der zweite Teil sin macht oder nicht.
Es verwundert mich nur da dort andere werte herauskommen.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 06.10.14 14:21 
Ein Byte ist kein ASCII Zeichen.
ASCII ist ein 7-bit Format. Ein Byte hat aber nun mal 8 davon. Alles größer 127 ist undefiniert.
Für alles größer 127 (das undefinierte) wird ein Fallback Zeichen verwendet und das ist ein "?" (Wert = 63).

Ich würde dir auch empfehlen jetzt nicht stattdessen ein 8-Bit Format zu verwenden. Da irgendwie was ~regex~bares draus zu machen ist kaum hilfreich. Werte liebe die Bytes selber aus. Da hast du deutlich mehr Kontrolle als bei irgendwie gearteten Zeichen Encodern/Decodern die nicht wirklich den Anspruch haben umkehrbar zu sein und dann auf diese Pseudotexte (scheinbar sind deine Messwerte im Stream nicht als Zeichen sondern als ihre Byteewerte enthalten) auch noch Regexe anzuwenden kann nur schiefgehen.
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 06.10.14 14:42 
Ok das leuchte mir noch ein.
Problem ist aber das der Stream nicht unbedingt von der Bytelänge fest Definiert ist.
Es kann sein das zusätzlich noch ein paar Byte im string dabei sin und somit verschiebt sich alles.
Aus dem Grund kam ich auf die Idee mit Regex da kann ich nach Zeichenfolgen usw. suchen und entscheiden.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 06.10.14 15:11 
Und mit allem anderen würde ich bis zu 4 for-Schleifen ineinander schachteln müssen um die werte zu finden.
Was mir von der Performanten Seite nicht wirklich als sinnvoll erscheint wohl auch nicht ist.

Was macht den dann wirklich sin?
Beim byte zählen werde ich auf dauer bestimmt nicht glücklich.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)