zoukankan      html  css  js  c++  java
  • 常用进制转换

          最近的工作中,需要接触到一些硬件设备,处理这些设备的通讯,因此需要进行一些进制的转换。
          其实,二进制、十六进制这些基本的知识,在我们刚学编程的时候,基础课应该已经讲过的了。但是,包括我自己在内,当时也仅仅是知道一般的换算规则,但是具体怎么应用,在c#中又是如何表示,也是近期才有比较深的体会。
          具体的知识,各位就自己查看相关的基础知识了,这里我只给出自己在工作中的体会和实际的类库。
          首先,先解释下C#的类型。一般,我们常用的有 byte、short、int(Int32)、long(Int64)。这几个在底层的一些通讯中也是最常用到的。以下做了一个比较,大家一看便知:
          
          因此有:
    2个十六进制 = 1个字节 = 1个byte   =  8位
    4个十六进制 = 2个字节 = 1个short  =  16位
    8个十六进制 = 4个字节 = 1个int    =  32位
    16个十六进制= 8个字节 = 1个long   =  64位
    一个ASCII =  1个字节 =  2个十六进制
    一个汉字 =  2个字节 =  4个十六进制

          其他无符号的整数等,自己参考上述转换。

          使用C#的Com口API或者Tcp API等,返回的数据一般是一个byte数组,因此,我们便可以把想要的数据转换为相关的进制或者字符串。

    一般我们的硬件会有8位寄存器,16位寄存器,32位寄存器,64位寄存器。而厂商提供给我们的协议一般是用16进制表示,因此我们很容易就明白一个采用16位寄存器返回的数据:12FA3B4E,就是表示在设备中有两个寄存器返回了数据。

          以下提供常用的进制转换的API:

    16进制转其他进制

     1 /// <summary>
     2         /// 十六进制转二进制
     3         /// </summary>
     4         /// <example>
     5         ///     <code>
     6         ///         //result的结果为46
     7         ///         int result = NumberHelper.Hex2Dec("2E");
     8         ///     </code>
     9         /// </example>
    10         /// <param name="hex">16进制字符串</param>
    11         /// <returns>返回16进制对应的十进制数值</returns>
    12         public static int Hex2Dec(string hex)
    13         {
    14             return Convert.ToInt32(hex, 16);
    15         }
    16 
    17         /// <summary>
    18         /// 十六进制转二进制
    19         /// </summary>
    20         /// <example>
    21         ///     <code>
    22         ///         //result的结果为101110
    23         ///         string result = NumberHelper.Hex2Bin("2E");
    24         ///     </code>
    25         /// </example>
    26         /// <param name="hex">16进制字符串</param>
    27         /// <returns>返回16进制对应的2进制字符串</returns>
    28         public static string Hex2Bin(string hex)
    29         {
    30             return Dec2Bin(Hex2Dec(hex));
    31         }
    32 
    33         /// <summary>
    34         /// 十六进制转字节数组
    35         /// </summary>
    36         /// <example>
    37         ///     <code>
    38         ///         //result的结果为一个长度为2的字节数组
    39         ///         //其中result[0]=46,result[1]=61
    40         ///         byte[] result = NumberHelper.Hex2Bin("2E3D");
    41         ///     </code>
    42         /// </example>
    43         /// <param name="hex">16进制字符串</param>
    44         /// <returns>返回16进制对应的字节数组</returns>
    45         public static byte[] Hex2Bytes(string hex)
    46         {
    47             MatchCollection mc = Regex.Matches(hex, @"(?i)[\da-f]{2}");
    48             return (from Match m in mc select Convert.ToByte(m.Value, 16)).ToArray();
    49 
    50             //hexString = hexString.Replace(" ", "");
    51             //if ((hexString.Length % 2) != 0)
    52             //    hexString += " ";
    53             //byte[] returnBytes = new byte[hexString.Length / 2];
    54             //for (int i = 0; i < returnBytes.Length; i++)
    55             //    returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
    56             //return returnBytes;   
    57         }

    10进制转其他进制

     1 /// <summary>
     2         /// 十进制转二进制
     3         /// </summary>
     4         /// <example>
     5         ///     <code>
     6         ///         //result的结果为101110
     7         ///         string result = NumberHelper.Dec2Bin("46");
     8         ///     </code>
     9         /// </example>
    10         /// <param name="value">十进制数值</param>
    11         /// <returns>返回10进制数值对应的2进制字符串</returns>
    12         public static string Dec2Bin(int value)
    13         {
    14             return Convert.ToString(value, 2);
    15         }
    16 
    17         /// <summary>
    18         /// 十进制转十六进制
    19         /// </summary>
    20         /// <example>
    21         ///     <code>
    22         ///         //result的结果为2E
    23         ///         string result = NumberHelper.Dec2Bin("46");
    24         ///     </code>
    25         /// </example>
    26         /// <param name="value">十进制数值</param>
    27         /// <returns>返回10进制数值对应的16进制字符串</returns>
    28         public static string Dec2Hex(int value)
    29         {
    30             return Convert.ToString(value, 16).ToUpper();
    31         }
    32 
    33         /// <summary>
    34         /// 十进制转十六进制:格式化十六进制为指定位数,不足位数左边补0
    35         /// </summary>
    36         /// <example>
    37         ///     <code>
    38         ///         //result的结果为002E
    39         ///         string result = NumberHelper.Dec2Bin("46",4);
    40         ///     </code>
    41         /// </example>
    42         /// <param name="value">十进制数值</param>
    43         /// <param name="formatLength">十六进制结果的总长度</param>
    44         /// <returns>返回10进制数值对应的指定长度的16进制字符串</returns>
    45         public static string Dec2Hex(int value, int formatLength)
    46         {
    47             string hex = Dec2Hex(value);
    48             if (hex.Length >= formatLength) return hex;
    49             return hex.PadLeft(formatLength, '0');
    50         }

    2进制转为其他进制

     1 /// <summary>
     2         /// 二进制转十进制
     3         /// </summary>
     4         /// <example>
     5         ///     <code>
     6         ///         //result的结果为46
     7         ///         int result = NumberHelper.Bin2Dec("101110");
     8         ///     </code>
     9         /// </example>
    10         /// <param name="bin">二进制字符串</param>
    11         /// <returns>返回2进制字符串对应的10进制值</returns>
    12         public static int Bin2Dec(string bin)
    13         {
    14             return Convert.ToInt32(bin, 2);
    15         }
    16 
    17         /// <summary>
    18         /// 二进制转十六进制
    19         /// </summary>
    20         /// <example>
    21         ///     <code>
    22         ///         //result的结果为2E
    23         ///         string result = NumberHelper.Bin2Hex("101110");
    24         ///     </code>
    25         /// </example>
    26         /// <param name="bin">二进制字符串</param>
    27         /// <returns>返回2进制字符串对应的16进制字符串</returns>
    28         public static string Bin2Hex(string bin)
    29         {
    30             return Dec2Hex(Bin2Dec(bin));
    31         }

    单字节转为其他进制

     1 /// <summary>
     2         /// Byte转16进制
     3         /// </summary>
     4         /// <example>
     5         ///     <code>
     6         ///         byte b = 128;
     7         ///         string hex = NumberHelper.Byte2Hex(b);
     8         ///         Console.WriteLine(hex);//输出结果为80
     9         ///     </code>
    10         /// </example>
    11         /// <param name="b">一个字节</param>
    12         /// <returns>返回对应的16进制字符串</returns>
    13         public static string Byte2Hex(byte b)
    14         {
    15             return b.ToString("X2");
    16         }
    17 
    18         /// <summary>
    19         /// 单字节转换为2进制数值
    20         /// </summary>
    21         /// <example>
    22         ///     <code>
    23         ///         byte b = 128;
    24         ///         string bin = NumberHelper.Byte2Bin(b);
    25         ///         Console.WriteLine(bin);//输出结果为10000000
    26         ///     </code>
    27         /// </example>
    28         /// <param name="b">一个字节</param>
    29         /// <returns>返回对应的2进制字符串</returns>
    30         public static string Byte2Bin(byte b)
    31         {
    32             return Dec2Bin(b);
    33         }

    多个字节转为其他进制

      1 /// <summary>
      2         /// 字节数组转ASCII
      3         /// </summary>
      4         /// <example>
      5         ///     <code>
      6         ///         byte[] buffer = new byte[] {65,66,67};
      7         ///         string result = NumberHelper.Bytes2ASCII(buffer);
      8         ///         Console.WriteLine(result);//结果输出:ABC
      9         ///     </code>
     10         /// </example>
     11         /// <param name="bytes">字节数组</param>
     12         /// <returns>返回该字节数组对应的ASCII码字符串</returns>
     13         public static string Bytes2ASCII(byte[] bytes)
     14         {
     15             return Encoding.ASCII.GetString(bytes, 0, bytes.Length);
     16         }
     17 
     18         /// <summary>
     19         /// 字节数组转十六进制
     20         /// </summary>
     21         /// <example>
     22         ///     <code>
     23         ///         byte[] buffer = new byte[] { 65, 66, 67 };
     24         ///         string result = NumberHelper.Bytes2Hex(buffer);
     25         ///         Console.WriteLine(result);//结果输出:414243
     26         ///     </code>
     27         /// </example>
     28         /// <param name="bytes">字节数组</param>
     29         /// <returns>返回该字节数组对应的16进制字符串</returns>
     30         public static string Bytes2Hex(byte[] bytes)
     31         {
     32             string returnStr = "";
     33             if (bytes != null)
     34             {
     35                 for (int i = 0; i < bytes.Length; i++)
     36                 {
     37                     returnStr += bytes[i].ToString("X2");
     38                 }
     39             }
     40             return returnStr;
     41         }
     42 
     43         /// <summary>
     44         /// 将两个字节转换为十六进制数
     45         /// </summary>
     46         /// <example>
     47         ///     <code>
     48         ///         byte[] buffer = new byte[] { 65, 66 };
     49         ///         
     50         ///         //高位在前,低位在后
     51         ///         string result = NumberHelper.Bytes2Hex(buffer[0],buffer[1]);
     52         ///         Console.WriteLine(result);//结果输出:4142
     53         ///         
     54         ///         //低位在前,高位在后
     55         ///         result = NumberHelper.Bytes2Hex(buffer[1], buffer[0]);
     56         ///         Console.WriteLine(result);//结果输出:4241
     57         ///     </code>
     58         /// </example>
     59         /// <param name="hByte">高字节</param>
     60         /// <param name="lByte">低字节</param>
     61         /// <returns>返回该两个字节对应的16进制数结果</returns>
     62         public static string Bytes2Hex(byte hByte, byte lByte)
     63         {
     64             return Byte2Hex(hByte) + Byte2Hex(lByte);
     65         }
     66 
     67         /// <summary>
     68         /// 将两个字节转换为十进制数
     69         /// </summary>
     70         /// <example>
     71         ///     <code>
     72         ///         byte[] buffer = new byte[] { 65, 66 };
     73         ///         
     74         ///         //高位在前,低位在后
     75         ///         int result = NumberHelper.Bytes2Dec(buffer[0], buffer[1]);
     76         ///         Console.WriteLine(result);//结果输出:16706
     77         ///         
     78         ///         //低位在前,高位在后
     79         ///         result = NumberHelper.Bytes2Dec(buffer[1], buffer[0]);
     80         ///         Console.WriteLine(result);//结果输出:16961
     81         ///     </code>
     82         /// </example>
     83         /// <param name="hByte">高字节</param>
     84         /// <param name="lByte">低字节</param>
     85         /// <returns></returns>
     86         public static int Bytes2Dec(byte hByte, byte lByte)
     87         {
     88             return hByte << 8 | lByte;
     89         }
     90 
     91         /// <summary>
     92         /// 将两个字节(补码表示)转换为十进制数,如果是补码,则第一个bit为1则表示负数
     93         /// </summary>
     94         /// <example>
     95         ///     <code>
     96         ///         byte[] buffer = new byte[] { 255, 66 };
     97         ///         
     98         ///         //高位在前,低位在后
     99         ///         int result = NumberHelper.Bytes2Dec(buffer[0], buffer[1],false);
    100         ///         Console.WriteLine(result);//结果输出:65346
    101         ///         
    102         ///         //高位在前,低位在后
    103         ///         result = NumberHelper.Bytes2Dec(buffer[0], buffer[1], true);
    104         ///         Console.WriteLine(result);//结果输出:-190
    105         ///     </code>
    106         /// </example>
    107         /// <param name="hByte">高位字节</param>
    108         /// <param name="lByte">低位字节</param>
    109         /// <param name="isRadix">是否是采用补码表示形式</param>
    110         /// <returns>返回对应的10进制数值</returns>
    111         public static int Bytes2Dec(byte hByte, byte lByte, bool isRadix)
    112         {
    113             var v = (ushort)(hByte << 8 | lByte);//合并高地位为16进制
    114             if (isRadix)
    115             {
    116                 if (hByte > 127)
    117                 {
    118                     v = (ushort)~v; //按位取反
    119                     v = (ushort)(v + 1); //得到补码
    120                     return -1 * v;
    121                 }
    122             }
    123             return v;
    124         }
  • 相关阅读:
    HDU 5273 Dylans loves sequence 暴力递推
    HDU 5285 wyh2000 and pupil 判二分图+贪心
    HDU 5281 Senior's Gun 贪心
    HDU 5651 xiaoxin juju needs help 逆元
    HDU 5646 DZY Loves Partition
    HDU 5366 The mook jong
    HDU 5391Z ball in Tina Town 数论
    HDU 5418 Victor and World 允许多次经过的TSP
    HDU 5642 King's Order dp
    抽屉原理
  • 原文地址:https://www.cnblogs.com/marvin/p/number_helper.html
Copyright © 2011-2022 走看看