Conversion d'hexadécimal en chaîne

Je dois vérifier un string situé dans un paquet que je reçois en tant que Tableau byte. Si j'utilise BitConverter.ToString(), j'obtiens les octets comme string avec des tirets (par exemple: 00-50-25-40-A5-FF).
J'ai essayé la plupart des fonctions que j'ai trouvées après un googling rapide, mais la plupart d'entre elles ont le type de paramètre d'entrée string et si je les appelle avec le string avec des tirets, il lève une exception.

J'ai besoin d'une fonction qui transforme hex(comme string ou byte) dans le string, ce qui représente la valeur hexadécimale(f.e.: 0x31 = 1). Si l' le paramètre d'entrée est string, la fonction doit reconnaître les tirets(exemple "47-61-74-65-77-61-79-53-65-72-76-65-72"), car BitConverter ne convertit pas correctement.

27
demandé sur Jeroen Vannevel 2009-04-07 13:45:10

6 réponses

Comme ça?

static void Main()
{
    byte[] data = FromHex("47-61-74-65-77-61-79-53-65-72-76-65-72");
    string s = Encoding.ASCII.GetString(data); // GatewayServer
}
public static byte[] FromHex(string hex)
{
    hex = hex.Replace("-", "");
    byte[] raw = new byte[hex.Length / 2];
    for (int i = 0; i < raw.Length; i++)
    {
        raw[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
    }
    return raw;
}
54
répondu Marc Gravell 2009-04-07 10:01:06
string str = "47-61-74-65-77-61-79-53-65-72-76-65-72";
string[] parts = str.Split('-');

foreach (string val in parts)
{ 
    int x;
    if (int.TryParse(val, out x))
    {
         Console.Write(string.Format("{0:x2} ", x);
    }
}
Console.WriteLine();

Vous pouvez diviser la chaîne au-
Convertir le texte en entiers (int.TryParse)
Afficher l'int sous forme de chaîne hexadécimale {0: x2}

9
répondu Dead account 2009-04-07 09:58:55

Pour le support Unicode:

public class HexadecimalEncoding
{
    public static string ToHexString(string str)
    {
        var sb = new StringBuilder();

        var bytes = Encoding.Unicode.GetBytes(str);
        foreach (var t in bytes)
        {
            sb.Append(t.ToString("X2"));
        }

        return sb.ToString(); // returns: "48656C6C6F20776F726C64" for "Hello world"
    }

    public static string FromHexString(string hexString)
    {
        var bytes = new byte[hexString.Length / 2];
        for (var i = 0; i < bytes.Length; i++)
        {
            bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
        }

        return Encoding.Unicode.GetString(bytes); // returns: "Hello world" for "48656C6C6F20776F726C64"
    }
}
7
répondu franckspike 2014-12-08 17:23:36

Votre référence à "0x31 = 1" me fait penser que vous essayez réellement de convertir des valeurs ASCII en chaînes - auquel cas vous devriez utiliser quelque chose comme L'encodage.ASCII.GetString(Byte [])

1
répondu Will Dean 2009-04-07 09:59:33

Si vous avez besoin du résultat en tant que tableau d'octets, vous devez le passer directement sans le changer en chaîne,puis le changer en octets. Dans votre exemple, le (F. E.: 0x31 = 1) est les codes ASCII. Dans ce cas, pour convertir une chaîne (de valeurs hexadécimales) en valeurs ASCII, utilisez: Encoding.ASCII.GetString(byte[])

        byte[] data = new byte[] { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30 };
        string ascii=Encoding.ASCII.GetString(data);
        Console.WriteLine(ascii);

La console affiche: 1234567890

0
répondu FyCyka LK 2016-07-25 15:35:59
 string hexString = "8E2";
 int num = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber);
 Console.WriteLine(num);
 //Output: 2274

À Partir de https://msdn.microsoft.com/en-us/library/bb311038.aspx

0
répondu Pawel Cioch 2017-01-03 04:20:44