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

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

    /// <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;
        }
    }