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         }  

 

posted @ 2015-05-23 14:40  maanshancss  阅读(2564)  评论(0编辑  收藏  举报