web-dev-qa-db-fra.com

C # hex à ascii

J'essaie de convertir une chaîne hexadécimale en ASCII, en utilisant ceci:

public void ConvertHex(String hexString)
{
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < hexString.Length; i += 2)
    {
        String hs = hexString.Substring(i, i + 2);
        System.Convert.ToChar(System.Convert.ToUInt32(hexString.Substring(0, 2), 16)).ToString();
    }
    String ascii = sb.ToString();
    MessageBox.Show(ascii);
}

mais j'obtiens une exception out or bounds, je suis sûr que c'est une erreur flagrante mais un autre code que j'ai essayé ne fonctionne pas non plus. Qu'est-ce que je fais mal?

17
Pete

Ce code convertira la chaîne hexadécimale en ASCII, vous pouvez copier coller ceci dans une classe et l'utiliser sans instancer

public static string ConvertHex(String hexString)
{
    try
    {
        string ascii = string.Empty;

        for (int i = 0; i < hexString.Length; i += 2)
        {
            String hs = string.Empty;

            hs   = hexString.Substring(i,2);
            uint decval =   System.Convert.ToUInt32(hs, 16);
            char character = System.Convert.ToChar(decval);
            ascii += character;

        }

        return ascii;
    }
    catch (Exception ex) { Console.WriteLine(ex.Message); }

    return string.Empty;
}

Notes

2 = Le non. des caractères hexString utilisés pour représenter un caractère ASCII.

System.Convert.ToUInt32(hs, 16) = "convertir les sous-chaînes hexadécimales de base 16 en un entier 32 bits non signé"

24
ArnaldoRivera

Il y a quatre trois problèmes ici:

  1. Comme vous incrémentez i de 2 à chaque itération, vous devez terminer à hexString.Length - 1. Cela n'a pas vraiment d'importance; l'incrémentation de deux après l'itération finale amènera le compteur au-dessus de la longueur vérifiée.
  2. Vous prenez le mauvais nombre de caractères dans hexString.
  3. hs n'est jamais utilisé.
  4. Vous n'ajoutez rien à sb.

Essaye ça:

for (int i = 0; i < hexString.Length; i += 2)
{
    string hs = hexString.Substring(i, 2);
    sb.Append(Convert.ToChar(Convert.ToUInt32(hs, 16)));
}

Notez qu'il n'est pas nécessaire de qualifier les types avec leur espace de noms, System (en supposant que vous l'avez référencé en haut du fichier avec une instruction using).

20
Will Vousden
String hs = hexString.Substring(i, i + 2);
System.Convert.ToChar(System.Convert.ToUInt32(hexString.Substring(0, 2), 16)).ToString();

Remarquez-vous que vous n'utilisez jamais hs ??

Et que vous convertissez les 2 premiers caractères encore et encore?

2
Henk Holterman

Puisque vous incrémentez votre index de 2, vous devez arrêter votre boucle un avant la fin de la longueur de la chaîne. Sinon, votre dernière itération de la boucle tentera de lire les caractères après la fin de la chaîne.

for (int i = 0; i < hexString.Length - 1, i += 2)
1
Andy White