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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yilukuangpao/article/details/81736133

有一个数字 :(+,-)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 位移运算符(<<左移和>>右移)

<< 位左移 ::左移运算的实质是将对应的数据的二进制值逐位左移若干位,并在空出的位置上填0,最高位溢出并舍弃

例:$a=10;

$b=$a<<2;

则$b=40,根据手册描述可以看出位运算可以看出向左移一位,则是实现乘2运算。由于位移操作的运算速度比乘法的 运算速度高很多。因此在处理数据的乘法运算的时,采用位移运算可以获得较快的速度。

**提示 将所有对2的乘法运算转换为位移运算,可提高程序的运行效率

>> 位右移 ::右移运算的实质是将对应的数据的二进制值逐位右移若干位,并舍弃出界的数字。如果当前的数为无符号数, 高位补零

例:$a = 25;//11001

b=a>>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码值

例:

<?php

//使用chr()函数和ord()函数进行字符串与ASCII码之间的转换,程序代码如下:

$str1=chr(88);

echo $str1; //返回值为X

echo "\t";

$str2=ord('S');

echo $str2; //返回值为83

//运行结果:X 83

?>

答案::::

//根据经纬度 转换为 二进制

// 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<$len;$i++){

$result = (ord($str[$skip+$i]) << ($i << 3)) | ($result);

}

return $result;

}

/*

* 高效的取1方法

*

* 得到一个十进制数里有几个1

*/

function getBit1($n)

{

$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;

}

猜你喜欢

转载自blog.csdn.net/yilukuangpao/article/details/81736133