在为我的加密类编译此代码时遇到错误,它说"抛出异常:' 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;
}
有人可以帮忙吗?
答案 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)的字符,否则它将出现与您相同的错误。确保输入参数不包含任何非十六进制字符串的字符。