转换为字节时System.FormatException

时间:2016-12-21 09:17:50

标签: c# asp.net encryption

在为我的加密类编译此代码时遇到错误,它说"抛出异常:' System.FormatException'在mscorlib.dll"

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

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

很可能输入无效。十六进制字符串只能包含A和F之间的数字和字符。

使用带有以下代码的字符串A3AEEEF4将返回四个字节:

var     bytes=StringToByteArray("A3AEEEF4");   
Console.WriteLine("Length {0}. Content: {1}", bytes.Length,String.Join("-",bytes));
---------
> Length 4. Content: 163-174-238-244

字符串AZAEEEF4虽然不是有效的十六进制字符串,因为第二个字母是Z。这会引发FormatException消息Additional non-parsable characters are at the end of the string.

事实上,这是这种情况的正确例外。这确实是一个格式错误的十六进制字符串。

您可以向方法添加异常处理以返回导致错误的字符对,例如:

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

或者您可以使用Byte.TryParse来避免抛出两个例外:

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 :(得分:-1)

我尝试用你的代码运行程序,看起来他们到目前为止没问题。 除非“String hex”包含任何不是十六进制字符串(0-9,A-F)的字符,否则它将出现与您相同的错误。确保输入参数不包含任何非十六进制字符串的字符。