专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 人工智能

关于AIS编码解码的两个小疑点

发布时间:2011-07-03 09:16:32 文章来源:www.iduyao.cn 采编人员:星星草
关于AIS编码解码的两个小问题

看了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

这下应该看清楚了吧!

 

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: