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

本文关键字:字节 字节数 数组 转换 十六进制 字符串 | 更新日期: 2023-09-27 18:07:20

我想从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"字符

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读取两个字符时,会引发异常,因为只有一个字符要读取。

由于不熟悉lambdas,我会将范围设置为以2为单位枚举,如果字符串长度不能被2整除,则抛出异常。