C# 中关于十六进制的一些方法

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)

你可能感兴趣的