AIS 解码
关于AIS编码解码的两个小问题
看了happyparrot 的一篇关于AIS解码的文章http://blog.****.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
这下应该看清楚了吧!