位,字节,字, 二进制,八进制,十进制,十六进制简单梳理
定义:
位(bit):也叫比特,计算机中最小的计量单位;1比特也即1个二进制位
字节(Byte):1个字节=8比特(位bit)=8个二进制位=2个16进制位
字(word):UTF-8下一个汉字由三个字节组成;其他一般情况下都由两个字节组成
二进制:0和1
八进制:0,1,2,3,4,5,6,7
十进制:0,1,2,3,4,5,6,7,8,9
十六进制:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
换算:
二进制13:1101 (1*2^3 + 1*2^2 + 0*2^1+1*2^0 = 8+4+0+1=13)
八进制13:15 (1*8^1 + 5*8^0 = 8 + 5 =13)
十进制13: 13 (1*10^1 + 3*10^0 = 10 +3 =13)
十六进制13:D(D*16^0 = 13*16^0 = 13)
显示数字13: 1(占用二个字节:0011 0001,写二进制太麻烦改为写十六进制 31),3(占用二个字节 0011 0011 写二进制太麻烦改为写16进制 33);
PHP中运用:
进制转换: base_convert(要转换的数, 数字原来的进制, 要转换的进制);
字符转ASCII:ord(字符);
ASCII转字符:chr(ASCII 值);
中英文数字转二进制 与二进制转中英文数字:
1 //UTF-8编码 2 $str = '中国1定NICE!!'; 3 $strlen = strlen($str); //3(中) + 3(国) + 1(1) + 3(定) + 1(N) + 1(I) + 1(C) + 1(E) + 1(!) + 3(!) = 18 4 $n = 0; 5 $strBin = ''; 6 while ($n < $strlen) { 7 $strAscii = ord($str[$n]);//字节转ASCII码,值为十进制 8 $binChar = base_convert($strAscii, 10, 2);//ASCII码转二进制 9 if(strlen($binChar) < 8) {//一个字节占8位 不足补0 10 $binChar = str_repeat("0", 8 - strlen($binChar)).$binChar; 11 } 12 $strBin .= $binChar; 13 $n++; 14 } 15 echo $strBin."<br/>";//汉字转二进制 16 17 $str = ''; 18 $ByteArr = str_split($strBin, 8); //分割成字节数组 总计18元素 19 foreach ($ByteArr as $Byte) { 20 $decChar = base_convert($Byte, 2, 10); //一个字节的二进制转十进制 21 $str .= chr($decChar);//ASCII码转字 22 } 23 echo $str; //中国1定NICE!!
扩展——十六进制转中英文
手上有个二进制包,我们放进winHex内查看:
ASCII能看到一个大概的字符组合,其中有部分是无法看到的,我们把十六进制的内容复制出来,然后进行转码查看
$hex = '4D6F64656C735C576561706F6E735CC8CBCEEF5CB3A4B1F85CD6D8CDB75CCBE9C1E9EFDB5CCBE9C1E9EFDB2E65636D';//复制出来的16进制数据 $arr = str_split($hex, 2);//由于是16进制的,一个字节等于2个16进制位 foreach($arr as $a){ $dec = base_convert($a, 16, 10);//16进制转10进制 $str .= chr($dec);//字符组装 } $str = mb_convert_encoding($str, 'utf-8', 'gbk');//需要转一下码 echo $str; //Models\Weapons\人物\长兵\重头\碎灵镗\碎灵镗.ecm