C# でバイト配列と16進数文字列を相互変換するには

September 23, 2007

.NET にバイト配列を16進数文字列にエンコード/デコードする方法が用意されていなかったので、自作した。(Base64 なら Convert にある。)
文字列への変換は、BitConverter.ToString に Replace(“-“, String.Empty) とすることでもできなくはなさそうだが、効率が良さそうには思えないので止めた。
Convert.ToString(b, 16) で b が16進数で1桁のときの0補完でハマった。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/// <summary>
/// バイト配列と文字列との変換機能を提供する
/// </summary>
public class BytesConvert
{
/// <summary>
/// バイト配列から16進数の文字列を生成します。
/// </summary>
/// <param name="bytes">バイト配列</param>
/// <returns>16進数文字列</returns>
public static string ToHexString(byte\[\] bytes) {
StringBuilder sb = new StringBuilder(bytes.Length * 2);
foreach (byte b in bytes) {
if (b < 16) sb.Append('0'); // 二桁になるよう0を追加
sb.Append(Convert.ToString(b, 16));
}
return sb.ToString();
}
/// <summary>
/// 16進数の文字列からバイト配列を生成します。
/// </summary>
/// <param name="str">16進数文字列</param>
/// <returns>バイト配列</returns>
public static byte\[\] FromHexString(string str) {
int length = str.Length / 2;
byte\[\] bytes = new byte\[length\];
int j = 0;
for (int i = 0; i < length; i++) {
bytes\[i\] = Convert.ToByte(str.Substring(j, 2), 16);
j += 2;
}
return bytes;
}
}
C#

tilfin freelance software engineer