Umwandlung von Hex-String
-
05-09-2019 - |
Frage
Ich brauche für eine string
in einem Paket befindet sich zu überprüfen, die ich als byte
Array erhalten. Wenn ich BitConverter.ToString()
verwenden, erhalte ich das Bytes als string
mit Bindestrichen (f.e .: 00-50-25-40-A5-FF).
Ich die meisten Funktionen habe ich versucht, nach einem schnellen googeln gefunden, aber die meisten von ihnen haben Eingabeparameter Typ string
und wenn ich sie mit dem string
mit Bindestrichen nennen, es gibt eine Ausnahme aus.
Ich brauche eine Funktion, die hex dreht (wie string
oder als byte
) in die string
, die den hexadezimalen Wert repräsentiert (f.e .: 0x31 = 1). Wenn der Eingangsparameter string
ist, sollte die Funktion Striche erkennen (zB „47-61-74-65-77-61-79-53-65-72-76-65-72“), weil BitConverter
nicht richtig konvertieren .
Lösung
Wie so?
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;
}
Andere Tipps
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();
können Sie teilen die Zeichenfolge am -
Konvertieren Sie den Text zu Ints (int.TryParse)
Ausgabe der int als Hex-String {0: x2}
Für die Unicode-Unterstützung:
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"
}
}
Ihr Verweis auf „0x31 = 1“ macht ich denke, dass Sie tatsächlich ASCII-Werte in Strings zu konvertieren versuchen - in dem Fall, dass Sie so etwas wie Encoding.ASCII.GetString (Byte []) verwendet werden sollten
string hexString = "8E2";
int num = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber);
Console.WriteLine(num);
//Output: 2274
https://msdn.microsoft.com/en-us/ Bibliothek / bb311038.aspx
Wenn Sie das Ergebnis als Byte-Array benötigen, sollten Sie es direkt übergeben, ohne es in einen String zu ändern, ist es dann zurück in Bytes ändern.
In Ihrem Beispiel der (f.e .: 0x31 = 1
) ist der ASCII-Codes. In diesem Fall eine Zeichenfolge (von Hex-Werten) in ASCII-Wert zu konvertieren verwenden:
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);
Die Konsole wird angezeigt: 1234567890