将十六进制字符串转换为字节数

时间:2014-06-08 16:01:53

标签: c# .net encoding

我想从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"由于索引和长度失败必须引用字符串中的位置 为什么会这样?

2 个答案:

答案 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整除,则抛出异常。