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

    为什么我们一般采用十六进制用来数据传输

         计算机的存储器(DRAM、SRAM、Flash、硬盘)和运算器全都基于二进制工作,所以本身的数据应该是二进制。但是,二进制表示数据太没效率,一个32位的整数就要写成0000 0000 0000 0000 0000 0000 0000 0011,不方便读写和记忆。十进制换算

    比较麻烦,而且没有按位对应关系;二进制数是计算机语言,而十六进制  16是2的4次方,这样系统在转换数制时会更加快捷,十六进制正好四位二进制对应一位十六进制(比如:1110->E),于是一个整数表示成0x00000003方便多了,0x是固定表示十六进制的开头。

         基础:进制转换的算法

                 十进制转二进制:用2辗转相除至结果为1,将余数和最后的1从下向上倒序写,就是结果。比如:352(十进制)—101100000(二进制)—540(八进制)—160(十六进制)—EG(二十四进制)—B0(三十二进制)—5W(进制)

                  352 / 2 = 176 余 0

                  176 / 2 = 88  余 0

                  88 / 2  = 44 余 0

                  44 / 2 = 22 余 0

                  22 / 2 = 11 余 0

                  11 / 2 = 5 余 1

                  5  /  2 = 2 余 1

                  2 / 2 = 1  余 0

                  故二进制为101100000

              二进制转十进制: 

              从最后一位开始算,依次为0、1、2...位,第n位数(0或1)乘以2的n次方得到的结果相加就是答案。比如上面的二进制:101100000

              第0位:0 乘 2的0次方 = 0

                        0 乘 2的1次方 = 0

                        0 乘 2的2次方 = 0

                        0 乘 2的3次方 = 0

                        0 乘 2的4次方 = 0

                        1 乘 2的5次方 = 32

                        1 乘 2的5次方 = 64

                        0 乘 2的5次方 = 0

                        1 乘 2的5次方 = 256

                        然后:0+0+0+0+0+32+64+0+256 = 352,

                        结果:352

          

                 二进制转八进制

                 可以3位二进制编为一组(不够左侧补0),然后从右边开始没三位按如这种方式替换:000—0,001—1,010—2,011—3,100—4,101—5,110—6,111—7

                 比如转换上面二进制101100000 那么分组为101-(5)  100-(4)  000-(0)

                 那么结果为:540

                 

               二进制转十六进制

                0000—0, 0001—1, 0010—2,0011—3

                0100—4, 0101—5, 0110—6,0111—7

                1000—8, 1001—9, 1010—A,1011—B

                1100—C, 1101—D,1110—E,1111—F

                此时分组为4位二进制数为一组,比如上面的二进制数据101100000,分组

                0001 0110 0000

                   1       6      0

                 所以结果为:160

                十六进制转换成十进制

                ABCDEF分别表示10 11 12 13 14 15,算法为:个位 + 十位乘以16 + 百位乘以16^2.....依次类推

                比如十六进制数据160: 0 + 6 * 16 + 1 * 16 ^ 2 =352。

                结果为:352

       进制转换的代码(C#)

         

    /// <summary>
        /// C#进制转换(二进制数在C#中无法直接表示,所有二进制都用一个字符串表示)  例如:二进制:1010表示字符串“1010”
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                int num = 10;
    
                //十进制转换为二进制字符串,//输出:1010
                Console.WriteLine(Convert.ToString(num, 2));
    
                //十进制转化为十六进制字符串,输出A
                Console.WriteLine(Convert.ToString(num,16));
    
                //二进制字符转换为十进制数,输出10
                string bin = "1010";
    
                Console.WriteLine(Convert.ToInt32(bin, 2));
    
    
    
                //二进制数据字符串转化为16进制,输出A
                string bin2 = "1010";
    
                Console.WriteLine(string.Format("{0:x}", Convert.ToInt32(bin2, 2)));
    
    
    
                //十六进制转二进制字符串,输出1010
                Console.WriteLine(Convert.ToString(0xa, 2));
    
    
    
                //十六进制转十进制,输出10
                Console.WriteLine(Convert.ToString(0xa, 10));
    
    
    
                string s1 = StrToHex("我爱你,宝宝");
    
                string s2 = HexToStr(s1);
    
                string s3 = HexToASCII("1231231231231");
    
                Console.WriteLine(s1);
    
                Console.WriteLine(s2);
    
                Console.WriteLine(s3);
    
                Console.ReadLine();
            }
    
    
    
            //HEX编码转换为——>ASCII编码
            public static string HexToASCII(string Msg)
            {
                byte[] buff = new byte[Msg.Length / 2];
    
                string Message = "";
    
                for (int i = 0; i < buff.Length; i++)
                {
                    buff[i] = byte.Parse(Msg.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber);
                }
    
                System.Text.Encoding chs = System.Text.Encoding.ASCII;
    
                Message = chs.GetString(buff);
    
                return Message;
            }
    
    
            //HEX编码转换为——>字符串
            public static string HexToStr(string Msg)
            {
                byte[] buff = new byte[Msg.Length / 2];
    
                string Message = "";
    
                for (int i = 0; i < buff.Length; i++)
                {
                    buff[i] = byte.Parse(Msg.Substring(i * 2, 2),System.Globalization.NumberStyles.HexNumber);            
                }
    
                System.Text.Encoding chs = System.Text.Encoding.GetEncoding("gb2312");
    
                Message = chs.GetString(buff);
    
                return Message;
            }
    
    
            //字符串转化为——>HEX编码
            public static string StrToHex(string Msg)
            {
                byte[] bytes = System.Text.Encoding.Default.GetBytes(Msg);//转换为字节(十进制)
    
                string str = "";
    
                for (int i = 0; i < bytes.Length; i++)
                {
                    str += string.Format("{0:X}", bytes[i]);               //转换为十六进制
                }
    
                return str;
            }
        }
    

      

        

  • 相关阅读:
    分享图片到在线服务
    获取和保存照片
    处理图片(updated)
    简化版“询问用户是否退出”
    捕获高像素照片(updated)
    处理高像素的照片
    加强版照片捕获
    图片拍摄、处理、镜头应用
    Windows Phone 推送通知的第四类推送
    网络通信
  • 原文地址:https://www.cnblogs.com/shikangjie/p/5690194.html
Copyright © 2011-2022 走看看