C# 16进制与字符串、字节数组之间的转换
1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串
//十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2)); //十进制转八进制 Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8)); //十进制转十六进制 Console.WriteLine("十进制166的十六进制表示: "+Convert.ToString(166, 16));
//十进制转十六进制
this.myResult.Text = myTempR.ToString("X"); //二进制转十进制 Console.WriteLine("二进制 111101 的十进制表示: "+Convert.ToInt32("111101", 2)); //八进制转十进制 Console.WriteLine("八进制 44 的十进制表示: "+Convert.ToInt32("44", 8)); //十六进制转十进制 Console.WriteLine("十六进制 CC的十进制表示: "+Convert.ToInt32("CC", 16));
//十六进制转十进制 myTempR 值= 234
int myTempR = int.Parse("EA",System.Globalization.NumberStyles.HexNumber);
扩展一: ToString() 方法可以将数值转换成字符串以十进制或十六进制转换eg:
private void TestHex() {
int a = 188;
this.textBox1.Text = "";
this.textBox1.AppendText("a(10) = " + a.ToString() + "\n");
this.textBox1.AppendText("a(16) = " + a.ToString("x") + "\n");
this.textBox1.AppendText("a(16) = " + a.ToString("X") + "\n");
}
//运行结果如下:
a(10) = 188
a(16) = bc
a(16) = BC
扩展二: 为了显示结果的整齐,我们需要控制十六进制表示的长度,如果长度不够,用前导的 0 填补。解决这个问题,我们只需要在格式说明符“x”或者“X”后写上表示长度的数字就行了。比如,要限制在 4 个字符的长度,可以写成“X4”。在上例中追加一句:
this.textBox1.AppendText("a(16) = " + a.ToString("X4") + "\n");
其结果将输出 a(16) = 00BC。
2.在串口通讯过程中,经常要用到 16进制与字符串、字节数组之间的转换
由十进制或字符串转换为"十六进制模式" 比如93转换为0x93 再转回就是147
/// <summary>
/// 把string 类型转换为十六进制 比如 93 转换为147
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private static int ConvertStringToHex(string str)
{
double var = 0;
Int32 t = 0;
int len = str.Length;
if (var > 8) //最长8位
return -1;
for (int i = 0; i < len; i++)
{
string y = str.Substring(i, 1);
char x = System.Convert.ToChar(y);
if (x >= 'a' && x <= 'f')//字符是可以比较大小的按ASCII值码大小比较;
t = x - 87;//a-f之间的ascii
else
t = x - 48;//0-9之间的ascii
var += t * System.Math.Pow(16, len - i - 1);
}
return Int16.Parse(var.ToString());
}
1 /// <summary> 2 /// 把字符串转换为十六进制字符串 比如字符串"AB" 会转换为字符串"4142" 3 /// 字符串 "12"会转换为字符串"3132" 其中% 是我直接加的分隔符 4 /// </summary> 5 /// <param name="Commonstr"></param> 6 /// <param name="encode"></param> 7 /// <returns></returns> 8 private static string StringToHexString(string Commonstr, Encoding encode) 9 { 10 byte[] b = encode.GetBytes(Commonstr);//按照指定编码将string编程字节数组 11 string result = string.Empty; 12 for (int i = 0; i < b.Length; i++)//逐字节变为16进制字符,以%隔开 13 { 14 result += Convert.ToString(b[i], 16); 15 } 16 return result; 17 } 18 19 /// <summary> 20 /// 把十六进制字符串转换为字符串 比如字符串"41%42" 会转换为字符串"AB" 31%32 会被转换为12 21 /// 很多时候应该是3132 两个连续的 22 /// </summary> 23 /// <param name="hs"></param> 24 /// <param name="encode"></param> 25 /// <returns></returns> 26 private static string HexStringToString(string hs, Encoding encode) 27 { 28 //以%分割字符串,并去掉空字符 29 string[] chars = hs.Split(new char[] { '%' }, StringSplitOptions.RemoveEmptyEntries); 30 byte[] b = new byte[chars.Length]; 31 //逐个字符变为16进制字节数据 32 for (int i = 0; i < chars.Length; i++) 33 { 34 b[i] = Convert.ToByte(chars[i], 16); 35 } 36 //按照指定编码将字节数组变为字符串 37 return encode.GetString(b); 38 }
1 /// <summary> 2 /// 字符串转16进制字节数组 3 /// </summary> 4 /// <param name="hexString"></param> 5 /// <returns></returns> 6 private static byte[] strToToHexByte(string hexString) 7 { 8 hexString = hexString.Replace(" ", ""); 9 if ((hexString.Length % 2) != 0) 10 hexString += " "; 11 byte[] returnBytes = new byte[hexString.Length / 2]; 12 for (int i = 0; i < returnBytes.Length; i++) 13 returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); 14 return returnBytes; 15 } 16 17 /// <summary> 18 /// 字节数组转16进制字符串 19 /// </summary> 20 /// <param name="bytes"></param> 21 /// <returns></returns> 22 public static string byteToHexStr(byte[] bytes) 23 { 24 string returnStr = ""; 25 if (bytes != null) 26 { 27 for (int i = 0; i < bytes.Length; i++) 28 { 29 returnStr += bytes[i].ToString("X2"); 30 } 31 } 32 return returnStr; 33 } 34 35 /// <summary> 36 /// 从汉字转换到16进制 37 /// </summary> 38 /// <param name="s"></param> 39 /// <param name="charset">编码,如"utf-8","gb2312"</param> 40 /// <param name="fenge">是否每字符用逗号分隔</param> 41 /// <returns></returns> 42 public static string ToHex(string s, string charset, bool fenge) 43 { 44 if ((s.Length % 2) != 0) 45 { 46 s += " ";//空格 47 //throw new ArgumentException("s is not valid chinese string!"); 48 } 49 System.Text.Encoding chs = System.Text.Encoding.GetEncoding(charset); 50 byte[] bytes = chs.GetBytes(s); 51 string str = ""; 52 for (int i = 0; i < bytes.Length; i++) 53 { 54 str += string.Format("{0:X}", bytes[i]); 55 if (fenge && (i != bytes.Length - 1)) 56 { 57 str += string.Format("{0}", ","); 58 } 59 } 60 return str.ToLower(); 61 } 62 63 ///<summary> 64 /// 从16进制转换成汉字 65 /// </summary> 66 /// <param name="hex"></param> 67 /// <param name="charset">编码,如"utf-8","gb2312"</param> 68 /// <returns></returns> 69 public static string UnHex(string hex, string charset) 70 { 71 if (hex == null) 72 throw new ArgumentNullException("hex"); 73 hex = hex.Replace(",", ""); 74 hex = hex.Replace("\n", ""); 75 hex = hex.Replace("\\", ""); 76 hex = hex.Replace(" ", ""); 77 if (hex.Length % 2 != 0) 78 { 79 hex += "20";//空格 80 } 81 // 需要将 hex 转换成 byte 数组。 82 byte[] bytes = new byte[hex.Length / 2]; 83 84 for (int i = 0; i < bytes.Length; i++) 85 { 86 try 87 { 88 // 每两个字符是一个 byte。 89 bytes[i] = byte.Parse(hex.Substring(i * 2, 2), 90 System.Globalization.NumberStyles.HexNumber); 91 } 92 catch 93 { 94 // Rethrow an exception with custom message. 95 throw new ArgumentException("hex is not a valid hex number!", "hex"); 96 } 97 } 98 System.Text.Encoding chs = System.Text.Encoding.GetEncoding(charset); 99 return chs.GetString(bytes); 100 }
顶
收藏
关注
评论
作者:王思明
出处:http://www.cnblogs.com/maanshancss/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。所有源码遵循Apache协议,使用必须添加 from maanshancss
出处:http://www.cnblogs.com/maanshancss/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。所有源码遵循Apache协议,使用必须添加 from maanshancss