Вот два метода расширения для преобразования шестнадцатеричной строки в байтовый массив и обратно:
static byte[] ParseAsBytes(static string s)
{
return Enumerable.Range(0, s.Length / 2)
.Select(i => byte.Parse(s.Substring(i * 2, 2),
NumberStyles.AllowHexSpecifier))
.ToArray();
}
static string ToHexString(this byte[] buffer)
{
return string.Concat(buffer.Select(i => i.ToString("X2")));
}
Использование:
var input = "0001020304050607";
var bytes = input.ParseAsBytes();
// bytes == new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }
var result = bytes.ToHexString();
// result == "0001020304050607"
(Для более эффективных реализаций посмотрите код внутреннего класса System.Security.Util.Hex, используя инструмент, подобный Reflector. Они используются свойством SerialNumber для преобразования внутреннего поля byte [] в классе X509Certificate в шестнадцатеричную строку.)