二进制数据处理(经纬度) |
您所在的位置:网站首页 › php位移运算 › 二进制数据处理(经纬度) |
有一个数字 :(+,-)30.6789 现在要用4个字节 32位表示 用高位(1位)表示正负(1代表+ 0 代表-) 用10位表示 整数 30 用21位表示小数6789 我想要的结果为 4个16进制的数
//补位数 函数 string str_pad ( string , int pad_length , string pad_string , int pad_type); string 指定字符串,pad_length指定长度,pad_string用来填充的字符串(可选参数),pad_type指定填充位置(可选参数,STR_PAD_LEFT,STR_PAD_BOTH); 如果pad_string , pad_type均为空,那么就等于默认pad_string 为空格, pad_type就是自动填充在指定字符串的末端.
//进制转换 1: 十进制转二进制 decbin() 例:echo decbin(12); //输出 1100 2:十进制转八进制 decoct() 例:echo decoct(15); //输出 17 3:十进制转十六进制 dechex() 例:echo dechex(10); //输出 a 4:二进制转十六制进 bin2hex() 例:echo bin2hex('A'); //字符对应的ascii 十进制 65 十六进制 41 返回 ASCII 字符串,为参数 str 的十六进制表示。转换使用字节方式,高四位字节优先 $binary = "11111001"; $hex = dechex(bindec($binary)); echo $hex;//输出f9 5:二进制转十制进 bindec() 例:echo bindec('110011'); //输出 51 6:八进制转十进制 octdec() 例:echo octdec('77'); //输出 63 7:十六进制转十进制 hexdec() 例: var_dump(hexdec("See")); var_dump(hexdec("ee")); // both print "int(238)" 8:任意进制转换 base_convert() 例:$hexadecimal = 'A37334'; echo base_convert($hexadecimal, 16, 2);//输出 101000110111001100110100
//PHP 位移运算符(右移) >2;//等价于:11001 >> 01100, 01100 >> 00110.那么110 =》 6,即25/4 = 6 b=(0000 0000 0000 0110)=6 如果当前的数据为有符号数,在进行右移的时候,根据符号位决定左边补0还是补1。 如果符号位为0,则左 边补0;但是如果符号位为1,则根据不同的计算机系统,可能有不同的处理方式。 可以看出位右移运算,可以实现对除数为2的整除运算。 **提示 将所有对2的整除运算转换为位移运算,可提高程序的运行效率
// 高位 低位 ???????????
//ord chr string chr (int ascii); 该函数用于将ASCII码值转化为字符串 int ord(string str); 该函数用于将字符串转化为ASCII码值 例:
答案::::
//根据经纬度 转换为 二进制 // 10位代表整数,21位代表小数 用高位(1位)表示正负(1代表+ 0 代表-) public function LatLngToBin($latLng){
$latLngArr = explode('.',$latLng); $int_bin = decbin($latLngArr[0]); $int = str_pad($int_bin,10,'0',STR_PAD_LEFT); $abc = str_pad($latLngArr[1],6,'0',STR_PAD_RIGHT); $xs_bin = decbin($abc); $xs = str_pad($xs_bin,21,'0',STR_PAD_LEFT); $str = '1'.$int.$xs; $arr = str_split($str,8); $string = ''; for($i=3;$i>=0;$i--){ $string.= chr(bindec($arr[$i])); } return $string; }
// 解析经纬度 $latRes = $this -> commonfun($str,4,4); //纬度 南纬1 北纬0 $lat = $latRes & 0x7FFFFFFF; $new_lat = $lat >> 21; $lat_xs = ($lat & (0x1fffff))/1000000; $p_lat = $new_lat + $lat_xs;
/* * shen * 2017-5-18 * 为解析二进制数据服务的方法 * 参数:$str:需要解析的字符串 $skip:跳过的位数 $len:需要解析的位数 */ public function commonfun($str,$skip,$len){
$result = 0; for($i=0;$i $n = ($n&0x55555555) + (($n>>1)&0x55555555); $n = ($n&0x33333333) + (($n>>2)&0x33333333); $n = ($n&0x0f0f0f0f) + (($n>>4)&0x0f0f0f0f); $n = ($n&0x00ff00ff) + (($n>>8)&0x00ff00ff); $n = ($n&0x0000ffff) + (($n>>16)&0x0000ffff); return $n; } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |