Autor Beitrag
Zumlin
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 15.07.08 12:36 
Hallo zusammen,

ich habe das bereits in einem anderen Forum gepostet, bin dort aber zu keiner Lösung gekommen. Mein Problem:
Ich habe einen String der Form: "00 01 02 03" dieser soll die Hexzeichen 0x00, 0x01, 0x02 und 0x03 symbolisieren. Jetzt will ich das ganze in ein byte-Array umwandeln, in dem die symbolisierten (also 0x00 etc) Hexwerte abgelegt werden. Das habe ich mit Hilfe anderer bisweilen so gelöst, wobei str mein String ist:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
public static string HexToAsc(string str)
        {
            string[] hex = str.Split();
            string result = null;
            for (int i = 0; i < hex.Length; ++i)
                result += (char)Convert.ToUInt16(hex[i], 16);
            return result;
        }


//...
string asciistringtisend = HexToAsc(stringtosend);
byte[] buffer = Encoding.UTF8.GetBytes(asciistringtosend);
int laenge = buffer.Length;
forint r= 0; r<laenge;r++)
{
//Workaround
if(buffer[r] == 0xC2)
    {
      for(int k = r; k<buffer.Length-1;k++)
         buffer[k] = buffer[k+1];
      laenge--;
    }
}
byte[] befehl = new byte[laenge];
for(int l = 0; l<lange;l++)
   befehl[l] = buffer[l];
//...


Das Problem ist, dass es nicht mi allen Zeichen geht. Irgendwas passt wohl mit dem "Encoding.UTF8.GetBytes" nicht. da Ich aber auch "signed-Werte" brauche schien mir das als einziges passend.
Damals habe ich meinen Workauround für die mir bekannten Fehler erweitert für die Zeichen 0xC2 0x83 0xAF. Jetzt will ich aber gern das ganz fehlerfrei bekommen. Hat jemand ne Ahnung woran es liegt und was man ändern muss?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 15.07.08 13:12 
Schau dir einmal die HexToAsc-Funktion an: Hier extrahierst du schon die einzelnen Bytes, wozu also sie dann wieder zu Ascii-Text zusammenwerfen und als UTF8(!) wieder auslesen? Als Einzeiler:
ausblenden C#-Quelltext
1:
2:
3:
4:
static byte[] HexToBytes(string s)
{
  return s.Split().Select(hex => byte.Parse(hex)).ToArray();
}
Zumlin Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 15.07.08 14:15 
Puhh. Bei dem Einzeiler kapier ich schon das Split nicht. Was soll das ohne ein Argument machen? Was macht Select()? Das kenne ich auch nicht zudem gibt es das bei mir garnicht. Muss ich dazu noch was einbinden?

Bin leider ein Neuling hier...
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 15.07.08 15:56 
user profile iconZumlin hat folgendes geschrieben:
Was soll das ohne ein Argument machen?
Äh, das habe ich aus deinem Quelltext übernommen...
Um meinen ersten Satz noch einmal umzuformulieren: Setze in der HexToAsc-Funktion keinen String zusammen, sondern direkt ein Byte-Array.
Byte-Array mit Länge von hex erstellen und die Einträge in einer for-Schleife übertragen.
Zumlin Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 16.07.08 14:28 
Oh, das war ein Fehler. Split() muss natürlich Split(' ') heißen.

Ich cheks aber echt immer noch nicht. Hier mein Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
byte[] HextoAsc(string str)
{
string[] hexstring = str.Trim().Split(' ');
byte[] hexbytearray = new byte[hexstring.Length];
for(int i = 0; i<hexbytearray.Length;i++)
  hexbytearray[i] = byte.Parse(hexstring[i]);
return hexbytearray;
}


Ich habs so versucht, aber auch hier der gleiche Effekt. Sobald das MSB des ASCII Wertes high wird, funktionierts nicht mehr da die Funktion unter nem ASCII Wert eben einen unsigned Wert versteht. Ich möchte aber in der Lage sein von 0x00 bis 0xFF alles abzudecken.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 16.07.08 18:50 
user profile iconZumlin hat folgendes geschrieben:
Oh, das war ein Fehler.
:P . Ich schreibe nur Richtiges ab :zwinker: .

Ich bin mir nicht sicher, wie du die vorzeichenlosen Werte nun signed interpretieren willst, aber da du vom MSB sprichst, würde ich den Wert von byte.Parse einfach nach sbyte casten.
Zumlin Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 24.07.08 11:22 
Sorry für die Lange Zeit des Schweigens. ein cast auf sbyte brachte auch keinen Vorteil.Sobald das MSB gesetzt war wurde mit einem Fehler das Programm beendet.
Ich hab jetzt wieder meinen ursprünglichen Code am laufen mit ner kleinen Modifikation. "UTF8" habe ich mit "Default" ersetzt. Jetzt scheint es zu funktionieren. Ich habe zwar keine Ahnung obs dann auch auf anderen Rechnern läuft, aber das ist mir jetzt egal :)