2016-12-21 3 views
-1

Ich habe einen Fehler in Byte während diesen Code für meine Verschlüsselungs- Klasse kompilieren, sagen sie "Exception geworfen: 'System.FormatException' in mscorlib.dll"System.FormatException Während Convert

public static byte[] StringToByteArray(String hex) 
{ 
    int NumberChars = hex.Length; 
    byte[] bytes = new byte[NumberChars/2]; 
    for (int i = 0; i < NumberChars; i += 2) 
     bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
    return bytes; 
} 

Kann jemand helfen?

+1

Warum verwenden Sie nicht einfach Encoding.UTF8.GetBytes? –

+1

@ViVi das ist der gleiche Code, den das OP verwendet. –

+0

@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 –

Antwort

1

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; 
    } 
} 
-1

I Ich habe versucht, das Programm mit deinem Code zu starten und es sieht so aus, als hätten sie bisher kein Problem. Wenn "String hex" kein Zeichen enthält, das keine hexadezimale Zeichenfolge ist (0-9, A-F), wird dies mit dem gleichen Fehler wie bei Ihnen geschehen. Stellen Sie sicher, dass Ihr Eingabeparameter kein Zeichen enthält, das keine Hexadezimalzeichenfolge ist.

+0

Ihre Antwort kommt entweder auf "non-repro" oder "check your input". Das ist ein Grund, eine Frage zu stellen, nicht zu antworten. – CodeCaster

+0

Da ich den Beitrag nicht kommentieren kann, antworte ich stattdessen als Antwort. Es tut mir wirklich leid, wenn es jemanden stört. – Nagato

Verwandte Themen