位,字节,字, 二进制,八进制,十进制,十六进制简单梳理

定义:

位(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

 

posted @ 2023-01-18 15:36  Ryuma  阅读(2000)  评论(0编辑  收藏  举报