• 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() + " ");  
    this.textBox1.AppendText("a(16) = " + a.ToString("x") + " ");  
    this.textBox1.AppendText("a(16) = " + a.ToString("X") + " ");  
    } 

    //运行结果如下:

    a(10) = 188  
    a(16) = bc  
    a(16) = BC 

    扩展二: 为了显示结果的整齐,我们需要控制十六进制表示的长度,如果长度不够,用前导的 0 填补。解决这个问题,我们只需要在格式说明符“x”或者“X”后写上表示长度的数字就行了。比如,要限制在 4 个字符的长度,可以写成“X4”。在上例中追加一句:

    this.textBox1.AppendText("a(16) = " + a.ToString("X4") + " "); 

    其结果将输出 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("
    ", "");
     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         }  

     

  • 相关阅读:
    第十一节 jQuery特殊效果
    第十节 使用index和一个点击事件实现选项卡
    synchronized和lock两种锁的比较
    常见的四种线程池和区别
    mybatis中的#和$的区别
    web 防止SQL注入
    GIT配置免密登录
    热点 Key 问题的发现与解决
    Redis缓存击穿
    面试必问之JVM原理
  • 原文地址:https://www.cnblogs.com/maanshancss/p/4524118.html
Copyright © 2020-2023  润新知