public class HexHelper { /// <summary> /// 去除十六进制字符串中的空格、逗号、回车、换行、0x、0X,然后小写。 /// </summary> /// <param name="hexString"></param> /// <returns></returns> public static string Purify(string hexString) { return hexString.Replace(" ", "") .Replace(",", "") .Replace(" ", "") .Replace(" ", "") .Replace("0x", "") .Replace("0X", "") .ToLower(); } /// <summary> /// 将十六进制的数字(字符串类型),转换为十进制的数字。 /// </summary> /// <param name="hexString">自动 Purify。</param> /// <returns></returns> public static int ToInt32(string hexString) { return Convert.ToInt32(Purify(hexString), 16); } /// <summary> /// 将 byte[] 转换成十六进制的字符串。 /// </summary> /// <param name="data"></param> /// <returns></returns> public static string BytesToHexString(byte[] data) { StringBuilder sb = new StringBuilder(); foreach (byte b in data) { sb.Append(Convert.ToString(b, 16).PadLeft(2, '0')); } return Purify(sb.ToString()); } /// <summary> /// 将十六进制的字符串转换成 byte[]。 /// </summary> /// <param name="hexString">自动 Purify。</param> /// <returns></returns> /// <exception cref="ArgumentException"></exception> public static byte[] HexStringToBytes(string hexString) { hexString = Purify(hexString); if (hexString.Length % 2 != 0) { throw new ArgumentException("格式不正确。", nameof(hexString)); } byte[] bytes = new byte[hexString.Length / 2]; for (int i = 0; i < bytes.Length; i++) { bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); } return bytes; } }
这是在其他项目中写的一些方法,不完全完善,供参考。
其中转换成 ToInt32 那个,要说明的是将 16 进制的数字(字符串类型)转换成 10 进制的数字,并不是转换成对应的字符。也就是说:十六进制 41 对应的十进制是 65,它们对应的 ASCII 字符是 A。
Response.Write(Convert.ToInt32("49", 16)); // 73。 Response.Write(Convert.ToInt32(((char)Convert.ToInt32("49")).ToString())); // 1,因为 ASCII 49 对应的是 1。
总结
十六进制转十进制:Convert.ToInt32(s, 16)
byte 转十六进制字符串:Convert.ToString(b, 16).PadLeft(2, '0')
十六进制字符串转 byte:Convert.ToByte(s, 16)