<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.1" />

Hex

public sealed class Hex
Class to decode and encode Hex.
using System; using System.IO; namespace Org.BouncyCastle.Utilities.Encoders { public sealed class Hex { private static readonly HexEncoder encoder = new HexEncoder(); private Hex() { } public static string ToHexString(byte[] data) { return ToHexString(data, false); } public static string ToHexString(byte[] data, bool upperCase) { return ToHexString(data, 0, data.Length, upperCase); } public static string ToHexString(byte[] data, int off, int length) { return ToHexString(data, off, length, false); } public static string ToHexString(byte[] data, int off, int length, bool upperCase) { return ToHexString(data.AsMemory(off, length), upperCase); } public static string ToHexString(ReadOnlyMemory<byte> data, bool upperCase = false) { if (data.Length == 0) return string.Empty; if (data.Length > 1073741823) throw new ArgumentOutOfRangeException("data"); if (upperCase) return string.Create(data.Length * 2, data, delegate(Span<char> chars, ReadOnlyMemory<byte> data) { HexEncoder.EncodeUpper(data.Span, chars); }); return string.Create(data.Length * 2, data, delegate(Span<char> chars, ReadOnlyMemory<byte> data) { HexEncoder.EncodeLower(data.Span, chars); }); } public static byte[] Encode(byte[] data) { return Encode(data, 0, data.Length); } public static byte[] Encode(byte[] data, int off, int length) { MemoryStream memoryStream = new MemoryStream(length * 2); encoder.Encode(data, off, length, memoryStream); return memoryStream.ToArray(); } public static int Encode(byte[] data, Stream outStream) { return encoder.Encode(data, 0, data.Length, outStream); } public static int Encode(byte[] data, int off, int length, Stream outStream) { return encoder.Encode(data, off, length, outStream); } public static byte[] Decode(byte[] data) { MemoryStream memoryStream = new MemoryStream((data.Length + 1) / 2); encoder.Decode(data, 0, data.Length, memoryStream); return memoryStream.ToArray(); } public static byte[] Decode(string data) { MemoryStream memoryStream = new MemoryStream((data.Length + 1) / 2); encoder.DecodeString(data, memoryStream); return memoryStream.ToArray(); } public static int Decode(string data, Stream outStream) { return encoder.DecodeString(data, outStream); } public static byte[] DecodeStrict(string str) { return encoder.DecodeStrict(str, 0, str.Length); } public static byte[] DecodeStrict(string str, int off, int len) { return encoder.DecodeStrict(str, off, len); } } }