二进制数据处理(经纬度)

您所在的位置:网站首页 php位移运算 二进制数据处理(经纬度)

二进制数据处理(经纬度)

2023-09-22 16:33| 来源: 网络整理| 查看: 265

有一个数字 :(+,-)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