Wahrscheinlich ist die Eingabe ungültig. Ein Hex-String kann nur Ziffern und Zeichen zwischen A und F. enthalten
die Zeichenfolge A3AEEEF4
mit dem folgenden Code gibt vier Bytes:
var bytes=StringToByteArray("A3AEEEF4");
Console.WriteLine("Length {0}. Content: {1}", bytes.Length,String.Join("-",bytes));
---------
> Length 4. Content: 163-174-238-244
Der String AZAEEEF4
obwohl keine gültige Hexstring, weil die zweiter Buchstabe ist Z
. Dies wird eine FormatException
mit der Nachricht Additional non-parsable characters are at the end of the string.
auslösen In der Tat ist dies die richtige Ausnahme für diese Situation. Dies ist in der Tat eine fehlerhafte Hex-Zeichenfolge.
Sie könnten die Ausnahmebehandlung der Methode hinzufügen das Zeichenpaar zurückzugeben, die den Fehler verursacht hat, zum Beispiel:
byte[] StringToByteArray(String hex)
{
int NumberChars = hex.Length;
byte[] bytes = new byte[NumberChars/2];
for (int i = 0; i < NumberChars; i += 2)
{
var pair=hex.Substring(i, 2);
try
{
bytes[i/2] = Convert.ToByte(pair, 16);
}
catch (FormatException exc)
{
throw new FormatException($"Invalid pair {pair} at {i}", exc);
}
return bytes;
}
oder Sie können Byte.TryParse verwenden, um zwei Ausnahmen zu vermeiden werfen:
byte[] StringToByteArray(String hex)
{
int NumberChars = hex.Length;
byte[] bytes = new byte[NumberChars/2];
for (int i = 0; i < NumberChars; i += 2)
{
var pair=hex.Substring(i, 2);
if (!byte.TryParse(pair, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
out bytes[i/2]))
{
throw new FormatException($"Invalid pair {pair} at {i}");
}
return bytes;
}
}
Warum verwenden Sie nicht einfach Encoding.UTF8.GetBytes? –
@ViVi das ist der gleiche Code, den das OP verwendet. –
@Richard was ist die Zeichenfolge? Ein hexadezimaler String kann nur Ziffern und Buchstaben zwischen A und F enthalten. Vielleicht ist die Nachricht korrekt? Veröffentlichen Sie ein Beispiel, das das Problem reproduziert –