c#のstringを16進byte[]に変換

1681 ワード

この方法はネット上にたくさんあります.しかも、千編一律の書き方で、しかも間違っています.以下のようにします.
private static byte[] strToToHexByte(string hexString)
        {
             hexString = hexString.Replace(" ", "");
           if ((hexString.Length % 2) != 0)
                 hexString += " ";
            byte[] returnBytes = new byte[hexString.Length / 2];
            for (int i = 0; i < returnBytes.Length; i++)
                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
            return returnBytes;
         }

このコードを初めて見たとき、文字列の長さが奇数の場合、以下のエラーが報告されるので、間違いだと疑っていました.
“System.FormatException”  mscorlib.dll    

FormatExceptionの説明をもう一度見てみましょう.
value   fromBase  。  value  , ;
 ,  value  。 

最後に無効な末尾文字が含まれています.その末尾の文字は空の文字列でしょう.
だから私は2つの状況を分けるか、書き方を変えるべきだと思います.
以下に、改善されたアイデアを提供します.
考え方:このような書き方は1つのbyteが8位で、1つの16進法の数は4位しか必要ないので、2つの2つの読み取りが必要ですが、基数に遭遇すると面倒になります.最後のsubStringは2できません.1しかありません.では、上の考え方はスペースを加えて、2を補うことができますが、スペースを補うことができません.では、私たちもこのような考え方を続けることができます.例えば、01と1は実は1を表しているので、桁数を補うのに十分で、数値に影響を与えません.
private static byte[] strToToHexByte(string hexString)
        {
            hexString = hexString.Replace(" ", "");
            if ((hexString.Length % 2) != 0)
                hexString = hexString.Insert(hexString.Length - 1, 0.ToString());
            byte[] returnBytes = new byte[hexString.Length / 2];
            for (int i = 0; i < returnBytes.Length; i++)
                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
            return returnBytes;
        }