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.
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;
}
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}
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"
}
}
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 [])
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
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