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 .
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;
}
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}
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 les valeurs ASCII en chaînes - auquel cas vous devriez utiliser quelque chose comme Encoding.ASCII.GetString (Byte [])
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
string hexString = "8E2";
int num = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber);
Console.WriteLine(num);
//Output: 2274