Laden...

Hexwerte im String in "echte" Hexwerte umwandeln

Erstellt von Zumlin vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.499 Views
Z
Zumlin Themenstarter:in
20 Beiträge seit 2007
vor 15 Jahren
Hexwerte im String in "echte" Hexwerte umwandeln

Hallo zusammen,

ich hab da ein Problem und weiß einfach nicht wie ich das lösen soll.

Ich habe einen String in dem Hexwerte stehen. Also kann der String z.B. so aussehen: "0102030405060708090A0B0C0D0E0F".
Das ganze will ich übers Netzwerk verschicken. Wenn ich das machen, dann kommt auf der Gegenseite auch der String an. Ich will jedoch nicht den String verschicken, sondern die Hexwerte. Es soll also wenn ich den String "40" verschicke bei der Gegenseite der Sring"@" ankommen, was eben 0x40 in der ASCII Tabelle darstellt. Nur leider bin ich zu blöd das in c# zu Programmieren... 🙂

Gelöschter Account
vor 15 Jahren

edit :ah moment noch.

edit 2: jetzt aber^^

static void Main(string[] args)
    {
        string s = "6DA0AAFF400102030405060708090A0B0C0D0E0F";
        string toSend = string.Empty;
        for (int i = 0; i < s.Length - 1; i = i + 2)
        {            
            int first = Converter(s[i]);
            int second = Converter(s[i + 1]);
            byte[] toTranslate = new byte[1];
            toTranslate[0] = Convert.ToByte(first * 16 + second);            
            toSend += ASCIIEncoding.UTF8.GetString(toTranslate);           
        }       
    }
    static int Converter(char c)
    {
        int result = 0;
        switch (c)
        {
            case '0':
                result = 0x00;
                break;
            case '1':
                result = 0x01;
                break;
            case '2':
                result = 0x02;
                break;
            case '3':
                result = 0x03;
                break;
            case '4':
                result = 0x04;
                break;
            case '5':
                result = 0x05;
                break;
            case '6':
                result = 0x06;
                break;
            case '7':
                result = 0x07;
                break;
            case '8':
                result = 0x08;
                break;
            case '9':
                result = 0x09;
                break;
            case 'A':
                result = 0x0A;
                break;
            case 'B':
                result = 0x0B;
                break;
            case 'C':
                result = 0x0C;
                break;
            case 'D':
                result = 0x0D;
                break;
            case 'E':
                result = 0x0E;
                break;
            case 'F':
                result = 0x0F;
                break;

        }
        return result;
    }
915 Beiträge seit 2006
vor 15 Jahren

		[STAThread]
		static void Main(string[] args)
		{
			string test = "40";
			test = HexToAsc(test);
		}

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

[Edit] Ha, schneller 😜

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Gelöschter Account
vor 15 Jahren

ok Andreas.May deine version gefällt mir besser.

Z
Zumlin Themenstarter:in
20 Beiträge seit 2007
vor 15 Jahren

Funktioniert doch. Fast.
Wenn ich zb "F" oder "0F" schicke klappts. "0F12" kommt als 3F Ascii Wert an....

[edit]
es scheint, dass bei dem Split() der Komplette String in hexstring[0] zu sein scheint....

[edit2]
Also mit Split(' ') funktioniertes einwandfrei. Der String sieht dann eben so aus: "01 02 03"

Danke!

Z
Zumlin Themenstarter:in
20 Beiträge seit 2007
vor 15 Jahren

Jetzt muss ich aber leider den Weg zurück gehen.
Ich bekomme ein Antwort die in ein byte[] gepscihert wird. Diese sieht so aus:
0x00;0x00;0x0B;0x00
Das ganze iost als Hex-Stream zu sehen.

Wie bekomme ich diesen HexStream nun in einen String. Egal in welcher Form, wobei am schönsten schon "00 00 0B 00" wäre.
🙂

Gelöschter Account
vor 15 Jahren

regex

915 Beiträge seit 2006
vor 15 Jahren

Hrm, hatte das bisher wie folgt gemacht:


		[STAThread]
		static void Main(string[] args)
		{
			byte[] bytes = new byte[] { 0x48, 0x41, 0x4c, 0x4c, 0x4f };
			string[] hex = BytesToHex(bytes);

			StringBuilder sb = new StringBuilder(hex.Length);
			for (int i = 0; i < hex.Length; ++i)
				sb.Append(HexToAsc(hex[i]));

			// HALLO
			string mystring = sb.ToString();
		}

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

		public static string[] BytesToHex(byte[] bytes)
		{
			List<string> hex = new List<string>();
			for (int i = 0; i < bytes.Length; ++i)
				hex.Add(bytes[i].ToString("X2"));

			return hex.ToArray();
		}

/PS
++i ist nur nen dreher, warum ich das manchmal so tippsle weis ich nicht🙂

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Z
Zumlin Themenstarter:in
20 Beiträge seit 2007
vor 15 Jahren

Ahh. Danke. Das ist glaube ich genau das was ich gesucht habe. Das werde ich mal testen sobald ich an meinen Rechner wieder komme. Ist leider mein Praktikantenrechner in der Arbeit. Allgemein kann ich nur sagen, dass ich normalerweise in C für µC programmiere und daher mit C# noch keine Erfahrungen habe. Daher die ganze Fragerei 🙂
Aber wie gesagt, danke für die Hilfe!

915 Beiträge seit 2006
vor 15 Jahren

Fragen ist ja keine Schande und gebe zu hatte damals grade in diesen Bereich vorallem bei Bitoperatoren wahnsinnige Schwierigkeiten - da Hilft nur Erfahrungen sammeln

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Z
Zumlin Themenstarter:in
20 Beiträge seit 2007
vor 15 Jahren

Hmm. So ganz funktionierts noch nicht.

Bei der HexToAsc Funktion habe ich das Problem, dass sobald das MSB des Zeichens 1 wird, mir nur '0x3F' rückgegeben wird. Das hat sicher was damit zu tun, dass die "normale" Ascii-Tabelle nur 7 von 8 bits nützt, aber wie kann ich nun z.B. 0xFF umwandeln?

148 Beiträge seit 2006
vor 15 Jahren

Hallo Zumlin..

deine Funktion heisst "HexToAsc" und soll einen Hex zu einem Ascii-Zeichen umwandeln. Wenn nunmal 0xFF kein Ascii - Zeichen ist, was erwartest denn dann für eine sinnvolle Ausgabe?? 😉

ansonsten wäre Encoding das Stichwort zu dem du dich informieren solltest 🙂

greetz..

I cna tpye 300 wrods pre mnuite!

K
97 Beiträge seit 2006
vor 15 Jahren

Jetzt nicht direkt zu deiner Frage, aber

/PS
++i ist nur nen dreher, warum ich das manchmal so tippsle weis ich nicht

Du solltest schon wissen, wann du i und wann i schreibst 😉
bei i++ wird zuerst der aktuelle Wert von i verwendet, dann erhöht
bei ++i wird zuerst erhöht und dann der erhöhte Wert verwendet

Bei deiner for-Schleife ists egal, aber wenn du das zb bei einem Array machst wie

int i=0;
string[] testArray=new string[] { "text1", "text2" };

bekommst du bei

testArray[i++] -> text1

und bei

testArray[++i] -> text2

raus

trust is a weakness,
betrayal is the hidden blade

Z
Zumlin Themenstarter:in
20 Beiträge seit 2007
vor 15 Jahren

@Mystique

Ich will hald "FF" in '0xFF' wandelen und meine Antowrt darauf (z.B. '0xAA') wieder zurück in einen String (also "AA"). Dass das kein gültiges ASCII Zeichen ist, weiß ich, aber ich will ja auch nicht das ASCII Zeichen zum Wert ausgeben lassen, sondern diesen lediglich visualisieren.
Ich habe mich da ein bißchen ungeschickt asgedrückt glaube ich. Ich will also '0x40' nicht zu "@" wandeln, sondern in "40"!
Mit den obigen Funktionen funktioniert das auch gut, solange sich die ASCII-Werte als MSB 0 haben.

915 Beiträge seit 2006
vor 15 Jahren

Hrm, du wolltest also bei 0xAA das AA? also ca. wie folgt oder habe ich das falsch verstanden?


		[STAThread]
		static void Main(string[] args)
		{
			byte[] bytes = new byte[] { 0xAA, 0x48, 0x41, 0x4c, 0x4c, 0x4f };
			string[] hex = BytesToHex(bytes);

			StringBuilder sb = new StringBuilder(hex.Length);
			for (int i = 0; i < hex.Length; ++i)
			{
				sb.Append(HexToAsc(hex[i]));
			}

			// AAHALLO
			string mystring = sb.ToString();
		}

		private static uint mostSignificantBitPosition(uint n)
		{
			uint pos = 0;
			uint tmp;
			tmp = n >> 16;
			if (tmp != 0) { n = tmp; pos = pos + 16; }
			tmp = n >> 8;
			if (tmp != 0) { n = tmp; pos = pos + 8; }
			tmp = n >> 4;
			if (tmp != 0) { n = tmp; pos = pos + 4; }
			tmp = n >> 2;
			if (tmp != 0) { n = tmp; pos = pos + 2; }
			tmp = n >> 1;
			if (tmp != 0) { n = tmp; pos = pos + 1; }
			return pos + n - 1;
		}

		public static string HexToAsc(string str)
		{
			string[] hex = str.Split();
			string result = null;
			for (int i = 0; i < hex.Length; ++i)
			{
				uint n = Convert.ToUInt16(hex[i], 16);

				if (mostSignificantBitPosition(n)% 7 == 0)
				{
					result += hex[i].ToString();
				}
				else
					result += (char)n ;
			}
			return result;
		}

		public static string[] BytesToHex(byte[] bytes)
		{
			List<string> hex = new List<string>();
			for (int i = 0; i < bytes.Length; ++i)
			{
				hex.Add(bytes[i].ToString("X2"));
			}

			return hex.ToArray();
		}

LINK

@KenshinX
Jup, darüber bin ich auch schon gestolpert 😉

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Z
Zumlin Themenstarter:in
20 Beiträge seit 2007
vor 15 Jahren

Nicht ganz

Wenn ich den Strig "02 00 AA BB 00 00 00 00" mit HexToAsc umwandle...


public static string HexToAsc(string str)
        {
            string[] hex = str.Split(' ');
            string result = null;
            for (int i = 0; i < hex.Length; ++i)
            {
                uint n = Convert.ToUInt16(hex[i], 16);

                if (mostSignificantBitPosition(n)% 7 == 0)
                {
                    result += hex[i].ToString();
                }
                else
                    result += (char)n ;
            }
            return result;
        }

und dann in eine byte-Array wandle


byte[] buffer = Encoding.ASCII.GetBytes(umgewandelterstring);

... bekomme ich ein Array mit folgenden Werten:
0x02 0x00 0x41 0x41 0x42 0x42 0x00 0x00 0x00 0x00

...ich möchte aber
0x02 0x00 0xAA 0xBB 0x00 0x00 0x00 0x00

Das funktionierte auch mit folgendem Code:


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

solange das MSB nicht gesetzt war.

Sorry, dass ich immer so selbstverständlich frage, aber hab echt keinen Plan wie ich das machen soll.

915 Beiträge seit 2006
vor 15 Jahren

Phuuu... das müsste ich mir dann auch erstmal in aller Ruhe ansehen. Vielleicht findet derweil jemand anderes fix eine Lösung dafür.

Denke der Link könnte dir aber helfen selbst auf eine Lösung zu kommen.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Z
Zumlin Themenstarter:in
20 Beiträge seit 2007
vor 15 Jahren

Ok meine Lösung wäre (wobei die schon wirklich scheiße ist):


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

Dann vor dem senden umwandeln in ein byte-array und gegebenefalls falsche zeichen rausschmeißen:


string asciistringtisend = HexToAsc(stringtosend);
byte[] buffer = Encoding.UTF8.GetBytes(asciistringtosend);
int laenge = buffer.Length;
for( int r= 0; r<laenge;r++)
{
i  f(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];
//senden...

Nicht schön, aber funktioniert scheinbar....

915 Beiträge seit 2006
vor 15 Jahren

Finde das ganze schon okay - selbst wenn man das ein oder andere umschreibt könnte man kaum was verbessern. Irgendwie musst ja 0x41 0x41 zusammenführen zu 0xAA.

Denke das past schon.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Z
Zumlin Themenstarter:in
20 Beiträge seit 2007
vor 15 Jahren

Also ich bin gerade wieder über den Code in meinem Programm gestolpert. Leider funktioniert das ganze nicht so super. Die Umwandlung funktioniert nicht zuverlässig. Leider kommt es immer wieder zu Fehlern z.B. wird 0xC2 0x83 0xAF oder so zweimal in der Antowrt aufgeführt. Mein Workaround ist wie oben im Quelltext zu sehen:


//...
if(buffer[r] == 0xC2) // wobei mittlerweile einige andere noch aufgeführt sind
    {
      for(int k = r; k<buffer.Length-1;k++)
         buffer[k] = buffer[k+1];
      laenge--;
    }
//...

Woran liegt das, dass hier immer wieder Fehler entstehen? Ich habe keine Ahnung. Ich beziehe mich hier auf meinen zuletzt geposteten Quellcode.

Ich hoffe der Thread ist nicht zu alt und es lesen ihn doch wieder ein paar Leute 😉

87 Beiträge seit 2006
vor 15 Jahren

tach auch, ich hab mir das grad mal alles durch gelesen, hab aber irgend wie nich alles verstanden.

lass mich aml versuchen zu beschreiben was du machen willst.

  1. du hast einen string zb "0123456789abcdef"

  2. du möchtest diesen verschicken
    (es werden doch sicherlich byte (bzw byte[]) verschickt, oder?)

  3. du bekommst einen antwort
    (das sind doch noch bestimmt auch wieder byte (bzw byte[]) oder?)

dh also du möchtest den eine HexString in ein byte[] wandeln (wobei dann zb der string "ff" in den binärwert 0xff gewandelt wird) und das ganze auch wieder zurück oder wie seh ich das falsch?

denn daführ hätte ich eine lösung da

MfG

Tilton

PS: ich glaube du solltest dein ausgangspkt und dein ziel mal genauer/detailierter beschreiben, ich vermute nähmlich das die/das idee/konzept des umsetzens in code falsch is, und somit auch jeglicher code

"In der Informatik geht es genauso wenig um Computer wie in der Astonomie um Teleskope."
Edsger W. Dijkstra

The Humble Programmer by Edsger W. Dijkstra