为什么我们一般采用十六进制用来数据传输
计算机的存储器(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; } }