web-dev-qa-db-fra.com

Conversion d'hex en chaîne

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

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

29
Ivan Prodanov

Ainsi?

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;
}
55
Marc Gravell
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 ints (int.TryParse)
Affiche l'int en tant que chaîne hexadécimale {0: x2}

10
Dead account

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"
    }
}
8
franckspike

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

1
Will Dean

Si vous avez besoin du résultat sous forme de tableau d'octets, vous devez le passer directement sans le changer en chaîne, puis le remettre en octets . Dans votre exemple, le (f.e .: 0x31 = 1) correspond aux codes ASCII. Dans ce cas, pour convertir une chaîne (de valeurs hex) 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 affichera: 1234567890

0
FyCyka LK
 string hexString = "8E2";
 int num = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber);
 Console.WriteLine(num);
 //Output: 2274

De https://msdn.Microsoft.com/en-us/library/bb311038.aspx

0
Pawel Cioch