C# Byte Array in String Array umwandeln

palaber

Captain
Registriert
Juni 2006
Beiträge
3.856
Hi,

ich habe folgendes Problem. Ich habe ein Byte Array, welches ich in einen String umwandele. Hab mich an folgendem Code bedient:
Code:
private string ByteArrayToString(byte[] arr)
{
    System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    return enc.GetString(arr);
}

Das klappt auch. Nur hab ich jetzt einen String mit z.B. 22 Werten, wobei ich jeden 2. Wert nicht benoetige. Der zweite Wert kann sozusagen rausgeworfen werden. Jeder Wert besteht aus 24 characters.
Jetzt will ich aber nicht unbedingt den String durchsuchen und jeden Wert in ein String Array Element umwandeln, sonder dachte ich kann das evtl. gleich im oberen Schritt machen.

Habe dann die Methode so veraendert:
Code:
private string[ ] ByteArrayToString(byte[] arr)
{
    string[] arrData = new string[arr.length]:
    System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    for (int i = 0; i < arr.length; i++)
    {
          arrData[i] = enc.GetString(arr, i , i);
}
Aber da habe ich irgendwie nen Denkfehler drinnen. Das Array blaeht sich jetzt maechtig auf und laeuft auch nicht ganz durch. Kann mir jemand auf die Spruenge helfen? Waere super! DANKE!
 
Zuletzt bearbeitet:
Code:
private string ByteArrayToString( byte[] arr )
{
    var evens = SkipOdd( arr );
    return Encoding.ASCII.GetString( evens.ToArray() );
}

private IEnumerable<byte> SkipOdd( byte[] arr )
{
    for ( int i = 0; i < arr.Length; i += 2 )
    {
        yield return arr[i];
    }
}
 
Hört sich für mich nach UTF-16-Codierung (aka UnicodeEncoding) an, versuch mal:

Code:
private string ByteArrayToString(byte[] arr)
{
    System.Text.UnicodeEncoding enc = new System.Text.UnicodeEncoding();
    return enc.GetString(arr);
}

Falls das obige nicht funktioniert musst Du evtl. noch auf Big-Endian umschalten:

System.Text.UnicodeEncoding enc = new System.Text.UnicodeEncoding(true);

Ist das noch die Network-Analyzer-Geschichte?
Falls ja: Hast Du meine Antowrt von gestern Abend schon gelesen?


HTH

BigNum
 
Hey Holy, danke erstmal. Hab aber in meinem Code nen kleinen Fehler drin. Es soll kein String zurueck gegeben werden, sondern ein StringArray (hab ich jetzt verbessert).

Deinen Code versteh ich irgendwie nicht so ganz. Was macht der? Sorry, bin aber nicht so das Programmiergenie :(
So wie ich das verstehe bekomme ich auch kein String[] zuruek, oder?

Edit: Ja geht noch um die Network Analyzer geschichte, und ich glaub nicht, ich schau gleich nochmal rein. Danke!
 
palaber schrieb:
Hey Holy, danke erstmal. Hab aber in meinem Code nen kleinen Fehler drin. Es soll kein String zurueck gegeben werden, sondern ein StringArray (hab ich jetzt verbessert).

Deinen Code versteh ich irgendwie nicht so ganz. Was macht der? Sorry, bin aber nicht so das Programmiergenie :(
So wie ich das verstehe bekomme ich auch kein String[] zuruek, oder?

Dann verstehe ich dein Problem nicht :)

Der Code, den ich dir gepostet habe, wandelt einen Byte-Array in einen String (unter Verwendung eines ASCII-Decoders) um. Dabei wird jedes 2. Byte übersprungen. So habe ich auch deine Frage verstanden ;)


Edit.
OK, also wenn ich dich richtig verstehe, dann gibt der Byte-Array dir einen riesigen String zurück, den man alle 22 Chars splitten könnte, um einen Wert zu bekommen. Du brauchst aber nur jeden 2. Wert?
 
Zuletzt bearbeitet:
Genau, so ist es. Ich habe aber jetzt gerade gesehen, dass ich einen etwas anderen weg gehen kann. Ich kann direkt einen String aus meinem Oszi auslesen und muss nicht den umweg ueber das Bytearray gehen.
Sprich ich muss nur noch meinen String so durchlaufen lassen, dass ich das gewuenschte Ergebniss bekomme.

So ein String sieht so aus - zum besseren Verstaendnis:
-8.284357000000000E+00, 0.000000000000000E+00 -8.284357000000000E+00, 0.000000000000000E+00 -8.284357000000000E+00, 0.000000000000000E+00 -8.284357000000000E+00, 0.000000000000000E+00 usw.

Ich nehm jetzt einfach alle Kommas raus mit "replace". Dann weiss ich, dass jede Zahl 24 Character hat. Also schnippel ich von 0 - 23 den String raus und speichere ihn in string[0,0].
die naechsten 24 chars steck ich in string[0,1]. Fuer alle weiteren paerchen verfahre ich genau so. Jetzt muss ich nur noch rausfinden, wie ich aus nem string eine Zeichenkette von x-y rausschneide :D

PS: Danke fuer die Hilfe.
@bigNum: Ich hab jetzt deinen Eintrag gelesen und mach es so wie es da steht, das ist ein einfacher Weg.
 
In deinem Fall würden sich übrigens Regex anbieten. Das ist ein Mechanismus, der einen String nach bestimmten Mustern durchsucht und jeweils die gefundenen Muster ausgibt.

Also z.B. du definierst:
<Zahl>.<beliebig viele Zahlen>E+<zwei Zahlen>
und als Ausgabe erhält du:
  • -8.284357000000000E+00
  • 0.000000000000000E+00
  • -8.284357000000000E+00
  • 0.000000000000000E+00
usw.
schön getrennt in einer Liste.

Ist das das, was du willst, oder habe ich das falsch verstanden?
 
Genau das ist es, hab es aber etwas anders geloest. Da ich jeweils die zweite zahl nicht brauche. Hau ich erst mal alle Zeilenumbrueche und Kommas raus. Und dann nehm ich jeweils 24 Zeichen. Startwert vom naechsten element ist dann einfach n+48 dann passt das auch :)

Nur hab ich jetzt das problem fuer ein 11 Element array kein Problem fuer 101 auch nicht. Aber z.B. 401 Elemente will es nicht. Da hoert dann irgendwann der String auf. Also da sind nicht alle Elemte drin. Gibt es eine Maximale anzahl von Zeichen in einem String? Und wenn ja, wo liegt diese? Oder ist die Abhaengig vom RAM?

Bei 401 Elementen hab ich ca. 21500 Zeichen in dem String...
 
Um ehrlich zu sein, keine Ahnung :)
Was hast du vor? Ich vermute mal, du möchtest danach die Strings parsen, oder?

Wieso machst du nicht einfach ein string.Split und iterierst dann über das entstehende Array?
Die Zahlen kannst du dann mit double.Parse einlesen (der IFormatProvider ist dabei System.Globalization.NumberStyles.Float).

Edit.
Btw. wenn du sagst, nach 401 Elementen hört der String einfach auf, klingt das eher so, als würden einfach nicht mehr Daten in den Buffer der Gegenstelle passen (hier geht's wahrscheinlich noch um das Osziloskop, oder?)
 
Zuletzt bearbeitet:
Genau, es geht immernoch um die Oszi sache!
Habe beim Debugen jetzt festgestellt, dass es nicht am String liegt, sondern es ein Problem in meiner Schleife gibt. Ich poste dazu gleich was in dem anderen Thema.

https://www.computerbase.de/forum/threads/array-aus-hp8720d-osziloskop-auslesen.1120454/

Darum mal der link zu dem urspruenglichen Problem, da es am einfachsten ist jetzt beide Themen "zu verschmelzen". Hier kann dann eigentlich geschlossen werden.
 
Zurück
Oben