Laden...

Hex\dez <-> ASCII

Erstellt von MysticEmpires vor 19 Jahren Letzter Beitrag vor 16 Jahren 28.196 Views
M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 19 Jahren
Hex\dez <-> ASCII

Ich habe eine Problem:

Ich habe einen String der aus einem HEX Wert besteht.

z.b

"FF"

Ich hätter gern das dazu passende ASCII zeichen ich einen String is das irgent wie möglich? Wenns notwenig ist könnte ich den HEX wert auch in DEZ umwandeln. Habt ihr das evl. ne Idee? Ich beisse mir hier schon die Zähne aus.

M
8 Beiträge seit 2004
vor 19 Jahren

Hallo

lass die Zähne drin und probier mal ob dies deinen Wünschen entspricht!


public int HexToInt(string Value)
{
  //konvertiert einen Hexwert in einen Integer Wert
  return(Convert.ToInt32(Value,16)); // zum umrechnen Basis 16 verwenden
}

...Sascha

M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 19 Jahren

Ne das is ja nicht meine Problem. Das Problem ist das ich entweder:

ne Hex

41

oder ne Dez

65

habe und dazu den ASCII Wert "A" brauche. Der rest is nicht granz dasn Problem.

V
842 Beiträge seit 2003
vor 19 Jahren

Hi!

Moment. Du hast einen String wie "FF" und du möchtest Wissen welches Zeichen hinter der Zahl "FF" (Dezimal 255) steht?

Das macht doch die Funktion von mux72. Du musst das Ergebnis der Funktion nur an char zuweisen. In char werden auch nur Zahlen gespeichert, nämlich der ASCII-Wert des Zeichens, welcher allerdings als Zeichen ausgegeben wird. Wenn du eine Zahl (kein String) in Hex oder in Dez hast brauchst du es nur direkt an char zuweisen, wobei eine Hexzahl ein 0x vorangestellt hat.

Code-Hacker

M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 19 Jahren

Danke für den Tip. Aber leider kann ich nirgent was über eine Funktion wie mux72 finden (die MSDN hab ich leider nicht) und einen Google suche findet leider nichts.

4.207 Beiträge seit 2003
vor 19 Jahren

Hi,

mux72 ist der Benutzer hier im Forum, der Dir den entscheidenden Tipp gegeben hat ...

Viele Grüße,

Golo

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

X
2.051 Beiträge seit 2004
vor 19 Jahren
char ch = (char)Convert.ToInt32("0x41", 16); // HEX
char cd = (char)Convert.ToInt32("65"); // DEZ
I
15 Beiträge seit 2006
vor 17 Jahren
Hex in ASCII umwandeln

Hi Leute,

ich möchte ein Hex-Code in ein Char umwandeln (bzw. mehrere Codes in einen String)

Beispiel:

0x74 -> 't'

Hierzu habe ich verschiedene Snippets gefunden, z.B. das hier gepostete:

char c = (char)Convert.ToInt32("74", 16)

Das klappt dann auch bei dem obigen Beispiel. Folgender Hexcode lässt sich jedoch nicht zurückumwandeln:
0x8f -> 143 (dez) -> ??

Mit nem PHP Script klappt es. D sieht man an entsprechender Stelle, dass ein Leerzeichen erzeugt wurde. In meiner C#-Sharp Form wird in der Textbox nur so nen kleines Kästchen angezeigt. Mit Encondings habe ich schon rumgespielt und die besten Ergebnisse mit "Default" bekommen. Das Problem ist, dass nicht für alle HEX-Eingaben A gilt:
A = string2hex(hex2string(A));

Hex: e6ea4b7d8f0a084ba52f3b0631f3a29f90c9df74e24c
String: æêK} K¥/;1󢟐ÉßtâL

Hier noch ein Snippet, das das gleiche (nur zu 90%) korrekte Ergebnisse liefert:

String input = textBox1.Text;
      String sub = input.Substring(0,2);

      Byte  b = byte.Parse(sub, System.Globalization.NumberStyles.HexNumber);

      textBox2.Text = ((char)b).ToString();

Ich vermute, dass die Zeichen mit (char) entweder nicht konvertiert werden können oder nach dem Konvertieren ein Steuerungszeichen entsteht, dass aktiv etwas mit der TextBox macht (z.B. Zeilenumbruch) anstatt einfach "nur" angezeigt zu werden.

Weiß jmd Rat? Danke 😉

I
1.739 Beiträge seit 2005
vor 17 Jahren

0x74 -> 't'

Liegt wohl am Unicode.
da musst du wohl oder übel die Textencodingfunktionen bemühen...
Namespace System.Text(was sonst).
und natürlich Convert (Byteweise).

Du kanns ja mal die Forumssuche bemühen.

Edit:
geht so:


    public static string Str2Hex(string str)
    {
      System.Text.StringBuilder sb = new System.Text.StringBuilder();
      byte[] bt = System.Text.Encoding.ASCII.GetBytes(str);
      for(int i = 0; i < str.Length; i++)
      {
        sb.Append(string.Format("{0:X}", bt[i]).PadLeft(2, '0'));
      }
      sb.Append("00");//C-String 0-terminiert
      return sb.ToString();
    }
	}

I
15 Beiträge seit 2006
vor 17 Jahren

Hi,

danke fürs Snippet. Funktioniert leider nicht.

Hier am Beispiel 0x8f = 143:

Zunächst erzeuge ich das Zeichen.


int temp = 143; //Convert.ToInt32(textBox1.Text, 16);
textBox3.Text = ((char)temp).ToString();

Jetzt lese ich das erzeugte Zeichen wieder ein:


String temp = textBox3.Text;
textBox1.Text = Str2Hex(temp);

Als Ergebnis wird 0x3f geschrieben.. und das ist nunmal nicht 0x8f.

Ich vermute, dass beim Erzeugen und Füllen der TextBox ein Fehler auftritt 😉
Lt. http://de.wikipedia.org/wiki/Steuerzeichen ist 8F nämlich nen Shift..

Schade aber irgendwie, dass es mit PHP funzt: (LINK)

edit: Es liegt nicht an den TextBoxes. Wenn ich das ganze in nem String speichere, passiert das gleiche:

TextBox1 enthält den Hexwert, z.B. 8f.
Die Ausgabe in TextBox2 ist nur zur Info.
"output" wird direkt wieder zurückumgewandelt und es entsteht 3f?


int temp = Convert.ToInt32(textBox1.Text, 16);
String output = ((char)temp).ToString();
textBox2.Text = output;
textBox3.Text = Str2Hex(output);
L
17 Beiträge seit 2006
vor 17 Jahren

...das kommt mir bekannt vor. Ich hatte einen string, der aus Zeichen bestand. Wenn ich diesen umwandeln wollte, kam bei allen Werten, die höher als 127 (0x7F) waren, 0x3F zurück. Liegt daran, dass C# ASCII nur die ersten 127 Zeichen unterstützt. Ich habe das folgendermaßen gelöst:


internal static byte[] String2Hex(string s)
        {
            byte[] bt = Encoding.GetEncoding(850).GetBytes(s);
            return bt;
        }

(wie kann man hier mehrzeiligen Code einfügen?)

Aus dem String mit den Zeichen wird ein Bytearray, das die Hexwerte der Zeichen enthält. Ist zwar nicht genau das, was du wolltest, aber ich hoffe es hilft. Ich habe den Tip mit GetEncoding(850) auch hier im Forum gefunden 😉

Viele Grüße

larsen

I
15 Beiträge seit 2006
vor 17 Jahren

Herzlichen Dank für die Tipps. Meine Vorstellung lässt sich leider nicht damit realisieren. Ich hab ne kleine WEP-Verschlüsselungs-Simulation erstellt. Der zu ver- bzw. entschlüsselnde Text lässt sich sowohl als Char-Folge (ASCII) oder als Hexwerte darstellen.

Wenn man einen Text ver- und anschließend entschlüsselt, sollte halt der ursprüngliche Text herauskommen. Das klappt dann eben nur bei HEX. Muss ich mich mit arrangieren bzw. in der GUI irgendwie deutlich machen, dass man lieber auf Hex umstellt 😉

I
1.739 Beiträge seit 2005
vor 17 Jahren

@larsen78
Ist das angeben der CodePage immer notwendig(egal welche CultureInfo der Thread hat)?

@igel2006
Vielleicht bist du da einfach auf dem Holzweg und benötigst eher eine Unicode2Hex-Funktion?
Oder du solltest den C#(.Net) Unicode-String erst in ASCII umwandeln bevor du ASCII to irgendwas machst. Also .Net arbeitet mit 16-Bit Unicode nicht mit ASCII und nicht mit ANSI.

L
17 Beiträge seit 2006
vor 17 Jahren

@ikaros:
Ich kann dir leider nicht ganz folgen. Ich habe den Begriff CultureInfo noch nie gehört und hab ihn auch nicht in der Hilfe gefunden, sorry. Was meinst du damit?
Die Codepage 850 ist die DOS-Codepage (DOS und Windows geben bei dem selben Code teilweise unterschiedliche Zeichen aus). Ich brauchte halt die DOS-Zeichen. Ich nehme mal an, da C# standardmäßig nur die ersten 127 Zeichen ausgibt und bei allen höheren "?" (0x3F), dass man die Codepage explizit angeben muss, ja. Man kann ja auch eine andere angeben. Allerdings gibt es 4 (glaube ich) Überladungen für die .GetEncoding-Funktion. Da geht sicher noch mehr, ich bin es damit zufrieden, weil sie genau das macht, was ich will 😉

Hilft das? Wenn ja, dann erklär mir trotzdem mal, was du mit "CultureInfo" meinst, danke.

Viele Grüße

larsen

edit:
@igel2006: Du hast also ein Bytearray aus HEX-Werten, die korrekt sind? Die musst du doch nur noch in ASCII-umwandeln. Ich habe das folgendermaßen gemacht:
Ausgangspunkt ist ein Bytearray, das die HEX-Werte enthält (b[0] = e8, b[1] = ff usw).
Dann lasse ich folgende Funktion ablaufen:


internal static string Hex2String(byte[] bArray)
        {
            string sTelegram = string.Empty;

            foreach (byte b in bArray)
            {
                sTelegram += ((char)Convert.ToInt32(b));
            }
            return sTelegram;
        }

Heraus kommt ein String, der aus genau den Busctaben und Zeichen besteht, die die Zahlen im Array repräsentierten. Wolltest du das? Jetzt hast du sowohl meine Hex2String- als auch meine String2Hex-Funktion. Dann wandelst du das ganze eben vorher in Hex um, wenn es mit Hex funktioniert... 🤔
(btw: kann mir mal jemand erklären, wie man hier mehrzeiligen Code einfügt?)

I
15 Beiträge seit 2006
vor 17 Jahren

Original von larsen78

sTelegram += ((char)Convert.ToInt32(b));  

Hi Larsen,

danke, den Schnipsel benutze ich bereits. Hier mal ein Beispiel meines 'Fehlers'. Mal angeommen, b hat den Wert 0x07. Das wandel ich nun in ein Char um und gebe es in ein Dosfenster aus... Tatsächlich wird nichts ausgegeben, sondern ein Ton abgespielt. Der verpufft und lässt sich schlecht wieder einlesen. 😉

Also das mit Unicode klingt gut, aber ich glaube, ich lasse den Benutzer einfach primär auf den Hexwerten arbeiten. Eigentlich dient die ASCII Anzeige nur dazu, einen "sinnvollen" Text einzugeben und ihn anschließend in eine Hexfolge umzuwandeln.
Im Gegenzug soll man später die entschlüsselte Hexfolge in einen ASCII-Strom umwandeln, um zu prüfen, dass die Entschlüsselung geklappt hat.

LG

I
1.739 Beiträge seit 2005
vor 17 Jahren

Hier mal ein Beispiel meines 'Fehlers'. Mal angeommen, b hat den Wert 0x07. Das wandel ich nun in ein Char um und gebe es in ein Dosfenster aus... Tatsächlich wird nichts ausgegeben, sondern ein Ton abgespielt. Der verpufft und lässt sich schlecht wieder einlesen.

Bell(Ascii-code=7) ist ein Steuercode(macht Beep) der genau dafür erfunden wurde. Soll ein Steuerzeichen wie Beep, Linefeed, CarriageReturn usw. nicht seine Funktion erfüllen sondern z.B. als Text angezeigt werden, muss es logischerweise vor der Ausgabe umgewandelt werden(in das gewünschte Format halt).

L
17 Beiträge seit 2006
vor 17 Jahren

Naja, wenn die ASCII-Folge vom Benutzer eingegeben wird, dann sollte da wohl kein "Beep" dabei sein, zumindest auf meiner Tastatur fehlt diese Taste 😉. Du darfst wohl einfach nicht versuchen, die verschlüsselte Folge als ASCII auszugeben. Dann "verpufft" auch nichts.

VG larsen

L
17 Beiträge seit 2006
vor 17 Jahren

Hallo!

Habe eine bessere und schnellere Methode gefunden, Hex-Zahlen in ASCII-Werte umzuwandeln:

statt


foreach (byte b in bArray)
{
   sTelegram += ((char)Convert.ToInt32(b));
}
return sTelegram;

benutze ich nun


Encoding enc = Encoding.GetEncoding(850);
string sTelegram = enc.GetString(bArray);

vielleicht hilft dir das ja was (habe ich aber auch nur aus dem Forum, vielen Dank an herbivore 😄).

Viele Grüße

larsen

888 Beiträge seit 2007
vor 16 Jahren

So Leute ich fass das nochmal für die Nachwelt zusammen.
Eine Funktion die einen String in dem Hex-Zeichen enthalten sind umwandelt
zu einen Ascii-String.


using System.Globalization;

public String ConvertHexToAscii(String i_hexString)
        {
            byte[] bArray = new byte[i_hexString.Length / 2];

            // B-Array füllen.
            for (int i = 0; i < bArray.Length; i++)
            {
                // Jeweils zwei Zeichen als Byte parsen.
                String bString = i_hexString.Substring(2 * i, 2);
                byte b = Byte.Parse(bString, NumberStyles.HexNumber);

                // Geparstes Byte ablegen.
                bArray[i] = b;
            }

            //Umwandlung in Ascii String
            Encoding enc = Encoding.GetEncoding(850);
            String asciiString = enc.GetString(bArray);

            return asciiString;
        }

Vielen Dank an alle!