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

20 篇文章 0 订阅

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

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在C语言中,可以通过解析卫星数据来获取经纬度信息。一般来说,卫星数据是以二进制格式存储的,所以需要进行解析才能提取出有用的信息。 首先,需要了解卫星数据的格式。卫星数据通常包括标识符、时间、经纬度等信息。根据数据格式,可以使用 C 语言中的结构体来定义一个数据结构,以便存储卫星数据。 然后,通过读取文件或从其他来源获取卫星数据,并将其存储在定义的结构体中。可以使用 C 语言中的文件操作函数来读取文件,使用结构体的成员变量来存储各个字段的数值。 接下来,需要解析卫星数据,并提取出经纬度信息。通过对数据进行逐个字节或逐个位的读取和解析,可以获取经纬度的数值。根据卫星数据的格式,可以确定每个字段所占字节数或位数,并使用 C 语言中的位运算或其他相关函数进行解析。 最后,可以将得到的经纬度信息进行使用或输出。可以将经纬度存储在定义的结构体中的相应成员变量中,并根据需要进行进一步的处理,如计算距离或进行地图显示等。 需要注意的是,卫星数据的格式可能因不同的卫星系统而异,所以具体的解析方式可能会有所调整。此外,合理的错误处理也是必要的,以防止在解析过程中遇到异常情况。 总之,使用 C 语言解析卫星数据获取经纬度,需要了解数据格式、使用文件操作函数读取数据、定义适当的数据结构、解析数据并提取经纬度信息,最后进行使用或输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yilukuangpao

你的鼓励是我创造最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值