您的位置:首页 > 大数据 > 人工智能

关于AIS编码解码的两个小问题

2012-06-20 19:26 337 查看
看了happyparrot 的一篇关于AIS解码的文章http://blog.csdn.net/happyparrot/article/details/1585185

发现有两个问题这里做下笔记,首先还是感激作者提供珍贵的资料,这些资料真不多见。

1、博文说“编码格式的目的一是为了压缩信息内容”是不正确的。

这个编码是将原始的每6比特映射到一个特定集合中的某个字符,即变为8了比特,数据量不是压缩了,相反是膨大了。

至于为什么要做这样的编码,我想可能是便于报文数据的发送和传输。

 

2、 关于那个奇怪的解码算法

       outSix = inEight + 0x28;    //加上101000

       if(outSix > 0x80)          //如果SUM>10000000

              outSix += 0x20;       //加上100000

       else

              outSix += 0x28;       //加上101000

       outSix = outSix<<2;       //右移两位,获取LSB

由于映射的字符集合是个分段的,所以if(outSix > 0x80)是个分段点,

两段:[0x30, 0x57] 和 [ 0x60,0x77],分别将端点加0x28变为:

            [0x58, 0x7F] 和 [ 0x88,0x9F]

注意一下第一段的分界点0x7F,就明白为什么用0x80做分支了。

然后各个分支中为什么又做加法?

按照转换表,直观思路应该是字符与0x57比较,小于减0x30,大于则减0x38,没错这个算法就是这样算的:

只是二进制中减法可以转换为加法运算,即减一个数等于加上这个数的负数的补码,即减0x30等于加上-0x30的补码。

0x30 : 0110000

-0x30: 1110000(1bit符号位+6bit数据位)

-0x30补码:10000000-0110000 = 1010000 = 0x50 = 0x28 + 0x28

0x38 : 0111000

-0x38: 1111000

-0x38补码:10000000-0111000 = 01001000 = 0x48 = 0x28 + 0x20

这下应该看清楚了吧!

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法