我想从hex string
转换为byte[]
,我有这个功能:
public static byte[] StringToByteArray(string hex) {
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
当我的字符串是例如" 1234"这返回byte[]
但是当我的字符串是" 12345"由于索引和长度失败必须引用字符串中的位置
为什么会这样?
答案 0 :(得分:1)
你可以修改你的输入可被2整除一个“0”字符到你的字符串的开头
public static byte[] StringToByteArray(string hex)
{
if((hex.Length % 2) != 0)
hex = "0" + hex;
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
如果没有此'修复',当前代码将失败。 例如,假设一个字符串形式为“ABC”,那么Where返回位置0和2,它们作为输入传递给Select并在Substring调用中使用。但是,当尝试从位置2读取两个字符时,此调用会引发异常,因为只有一个字符要读取。
答案 1 :(得分:0)
不熟悉lambdas,我会将范围设置为枚举两次,如果字符串长度不能被2整除,则抛出异常。