关于AIS编码解码的两个小问题
来源:互联网 发布:永久免费进销存软件 编辑:程序博客网 时间:2024/05/16 11:54
看了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
这下应该看清楚了吧!
- 关于AIS编码解码的两个小问题
- 关于编码(一):url的编码和解码问题
- 关于Url编码解码的一个小知识点
- 关于URL 解码 编码问题
- 关于ios编码解码问题
- 编码解码的问题
- 关于编程中编码和解码的问题
- 关于BASE64Encoder和BASEDecoder的编码和解码问题
- 关于.Net安全性的两个小问题
- 记录两个关于Qt的小问题
- AIS解码算法
- AIS解码算法
- AIS解码算法
- AIS解码算法
- AIS解码算法
- AIS解码2
- C#关于编码、解码相关问题
- 关于web请求中的编码解码问题
- TI XDC工具入门简介
- read 系统调用剖析
- 使用XDC工具创建基于Codec Engine的dm6446双核工程
- Sql server left join,right join 和inner join的比较
- Android 系统下支持wifi和蓝牙共存通讯
- 关于AIS编码解码的两个小问题
- vss control
- 演示:通过触发器对数据库进行级联操作
- Linux IO子系统和文件系统读写流程
- 收集的程序员必读书
- 查询—聚合函数
- Flex中的CSS: (6) CSS匹配分析
- 啃书书
- strcpy和memcpy的区别