user-0 提问: 二进制数据压缩的问题

回复:
user: user-1
content: 那么这500个字符包含3000个二进制数据是如何得知的？如果是技术文档的话，它肯定也会告诉你编码格式的，或者提供SDK库解码函数，如果是你自己猜的，恐怕也未必准确。

user: user-2
content: 猜不到猜不到猜不到猜不到

user: user-1
content: 协议，是为了保证数据传输的可靠性而设计的一种结构，除了原生数据之外，还有附加的数据，诸如头标准、数据长度、校验值、同步标志等等，协议的复杂程度与数据可靠性要求高低、数据传输的环境恶劣程度有关。

user: user-0
content: 引用 16 楼 DelphiGuy 的回复:[quote=引用 9 楼 yqz1119 的回复:] [quote=引用 7 楼 baichi4141 的回复:] [quote=引用 5 楼 yqz1119 的回复:] 哦，那么一般二进制转成ASCII的方法和作用是什么啊？ 一个FIFO寄存器实时的输出二进制信号不是更简单么？仪表内的单片机为什么格外给做了个转换的程序？ 比较常见的是，明明协议用的是二进制，观察者却非要观察ASCII码[/quote]  我刚才又想到，ASCII一个是8Bits吧，500个ASCII字符就是40000bits，原始数据只是3000个二进制数据啊！ 并没有压缩？只是加密？[/quote]  原生数据占传输数据量的60%，应该是有某种传输协议的，未必是加密。 [/quote] 现场情况是超声波频率信号1分钟增减方向的记录，频率信号增计为0，减计为1，您说的传输协议，意思是里面不光记录增减，还要添加别的内容吧？时间坐标？或者超声波频率增加减少的幅值？

user: user-0
content: 引用 15 楼 gz_qmc 的回复:压缩你妹啊! 一个二进制位可以表示一个正负 一个ASCII字符有8位  500*8=4000个  压缩你妹啊 小弟不才，轻拍。

user: user-0
content: 引用 14 楼 zilaishuichina 的回复:lz还是应该问一下对方的压缩算法，完全靠自己猜是不靠谱的，现在lz硬要自己猜的话，那么就个人猜测一下：  首先3000个二进制数据，变成 500个ASCII，这大约应该是6位2进制 对应 一个 ASCII  从lz给的两段密文来看，加密用到的字符为 :;<=\BCDEFGIJUVYZ[]^bcdej  一共出现25个字符，lz可以再看看还有没有其他字符。（理论上应该是还有的，因为6位2进制可以表示64种不同的情况，当然不排除某些排列情况在lz的项目中是不会存在的）  然后就是关键的密码表 就是说，比如 :  对应 000000 ;  对应 000001 <  对应 000010 =  对应 000011 以此类推 这张密码表，需要lz根据明文 跟 密文 对比， 才能推测出来  然后加密过程就是每六位2进制对应一个ASCII 比如如上表为例 000000000001000010000011 加密为 :;<=  个人推测 ， 也是最基本的加密方式， 仅供参考 大神，我刚上班，你说的内容待我理解一上午我再反馈吧，十分感谢！

user: user-0
content: 引用 26 楼 DelphiGuy 的回复:我查了一下modbus协议，不管是ASCII模式还是RTU模式，都有起始位、数据、校验位、停止位这种设置（类似串口协议RS-232之类的），楼主可以自己解码试一试。 通讯方式是ModbusTCP，通讯方式十分清楚的，只是不清楚数据包的内容...

user: user-1
content: 我查了一下modbus协议，不管是ASCII模式还是RTU模式，都有起始位、数据、校验位、停止位这种设置（类似串口协议RS-232之类的），楼主可以自己解码试一试。

user: user-0
content: 引用 23 楼 wangyaninglm 的回复:  这个确实不好整

user: user-3
content: 使用ＬＺＷ压缩算法吧，

user: user-4
content: 这个确实不好整

user: user-0
content: 引用 20 楼 DelphiGuy 的回复:协议，是为了保证数据传输的可靠性而设计的一种结构，除了原生数据之外，还有附加的数据，诸如头标准、数据长度、校验值、同步标志等等，协议的复杂程度与数据可靠性要求高低、数据传输的环境恶劣程度有关。  “同步标志”我觉得很有道理，因为总计10台设备，MODBUS通讯是轮询的，时间上应该有个同步标记才对，这样软件才能分析出同一时间的频率变化，就是说，3000个0/1表示的是一个时间开始+频率变化的数据才对，只是我们猜不到设计者的意图， 如果是自己做的话，该如何实现“同步+1分钟3000次数据变化”的功能呢？

user: user-1
content: 引用 9 楼 yqz1119 的回复:[quote=引用 7 楼 baichi4141 的回复:] [quote=引用 5 楼 yqz1119 的回复:] 哦，那么一般二进制转成ASCII的方法和作用是什么啊？ 一个FIFO寄存器实时的输出二进制信号不是更简单么？仪表内的单片机为什么格外给做了个转换的程序？ 比较常见的是，明明协议用的是二进制，观察者却非要观察ASCII码[/quote]  我刚才又想到，ASCII一个是8Bits吧，500个ASCII字符就是40000bits，原始数据只是3000个二进制数据啊！ 并没有压缩？只是加密？[/quote]  原生数据占传输数据量的60%，应该是有某种传输协议的，未必是加密。

user: user-5
content: 压缩你妹啊! 一个二进制位可以表示一个正负 一个ASCII字符有8位  500*8=4000个  压缩你妹啊

user: user-6
content: lz还是应该问一下对方的压缩算法，完全靠自己猜是不靠谱的，现在lz硬要自己猜的话，那么就个人猜测一下：  首先3000个二进制数据，变成 500个ASCII，这大约应该是6位2进制 对应 一个 ASCII  从lz给的两段密文来看，加密用到的字符为 :;<=\BCDEFGIJUVYZ[]^bcdej  一共出现25个字符，lz可以再看看还有没有其他字符。（理论上应该是还有的，因为6位2进制可以表示64种不同的情况，当然不排除某些排列情况在lz的项目中是不会存在的）  然后就是关键的密码表 就是说，比如 :  对应 000000 ;  对应 000001 <  对应 000010 =  对应 000011 以此类推 这张密码表，需要lz根据明文 跟 密文 对比， 才能推测出来  然后加密过程就是每六位2进制对应一个ASCII 比如如上表为例 000000000001000010000011 加密为 :;<=  个人推测 ， 也是最基本的加密方式， 仅供参考

user: user-0
content: 我现在感觉老外的数据并没有压缩，而是加密了，就不想让我们看懂，可我就是这么个有点强迫症的人哦！ 大家仔细看看数据，别被我的标题误导了！

user: user-0
content: 引用 11 楼 zxhuser-7 的回复:[quote=引用 3 楼 baichi4141 的回复:] 一般的做法是看说明书，或者问厂家 如果只凭压缩前和压缩后数据就能判断压缩算法，要么这个压缩算法超级简单，要么做判断的人是超级专家+1[/quote]

user: user-7
content: 引用 3 楼 baichi4141 的回复:一般的做法是看说明书，或者问厂家 如果只凭压缩前和压缩后数据就能判断压缩算法，要么这个压缩算法超级简单，要么做判断的人是超级专家+1

user: user-0
content: 4000，写错了.

user: user-0
content: 引用 7 楼 baichi4141 的回复:[quote=引用 5 楼 yqz1119 的回复:] 哦，那么一般二进制转成ASCII的方法和作用是什么啊？ 一个FIFO寄存器实时的输出二进制信号不是更简单么？仪表内的单片机为什么格外给做了个转换的程序？ 比较常见的是，明明协议用的是二进制，观察者却非要观察ASCII码[/quote]  我刚才又想到，ASCII一个是8Bits吧，500个ASCII字符就是40000bits，原始数据只是3000个二进制数据啊！ 并没有压缩？只是加密？