c#のstringを16進byte[]に変換
1681 ワード
この方法はネット上にたくさんあります.しかも、千編一律の書き方で、しかも間違っています.以下のようにします.
このコードを初めて見たとき、文字列の長さが奇数の場合、以下のエラーが報告されるので、間違いだと疑っていました.
FormatExceptionの説明をもう一度見てみましょう.
最後に無効な末尾文字が含まれています.その末尾の文字は空の文字列でしょう.
だから私は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 += " ";
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;
}