首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将压缩算法转换为解压缩算法

将压缩算法转换为解压缩算法
EN

Stack Overflow用户
提问于 2022-08-26 13:38:18
回答 1查看 63关注 0票数 0

很抱歉,这个简单的问题,但它被大脑吹了,因为我不擅长数据结构。

首先,我有一个包含压缩原始数据的初始二进制文件。我的同事帮助我将字节转化为Python中的一个小数数组(下面给出了代码,工作得很好,将结果显示为Python中的图表)。

现在,我想做相反的操作,例如,将一个十进制数字数组转换成一个二进制文件,但是我完全被困住了。非常感谢您提前!

代码语言:javascript
复制
data_out = []

# decode 1st point
data_out.append(int.from_bytes(data_in[0:4], byteorder='big', signed=True))

i = 4
while i < len(data_in):
    # get next byte
    curr = int.from_bytes(data_in[i:i+1], byteorder='big', signed=False)
    if curr < 255:
        res = curr - 127
        data_out.append(res + data_out[-1])
        i = i + 1
    else:
        res = int.from_bytes(data_in[i+1:i+5], byteorder='little', signed=True)
        data_out.append(res)
        i = i + 5

from matplotlib import pyplot as plt
plt.plot(data_out)
plt.show()
EN

回答 1

Stack Overflow用户

发布于 2022-08-26 19:44:37

原始字节流被编码为一个或四个字节整数.第一个值以四字节整数的形式发送.在第一个值之后,要么在0..254范围内有一个字节,这表示-127到127之间的差异,要么有255后面跟着四个字节的带符号的小对数值,这是下一个值(不是差异)。其思想是,如果整数从一个缓慢地变化到另一个,这将通过发送一个字节而不是4个字节来将序列压缩到4倍。虽然如果您有太多的差异不适合一个字节,这可能会将数据扩展25%,因为无差异的值需要5个字节而不是4个字节。

要对这样的流进行编码,首先直接将第一个值编码为4个字节,即小endian。对于每个后续值,从这个值中减去前一个值。如果结果在-127到127之间,则添加127并发送该字节。否则,发送255个字节,后面跟着值(而不是差值),作为一个4字节有符号的小对数值。

正如@灰胡子所指出的,同事的代码(假设它在这里被正确复制)中有一个错误,即res没有初始化。第一点解码需要:

代码语言:javascript
复制
# decode 1st point
res = int.from_bytes(data_in[0:4], byteorder='big', signed=True)
data_out.append(res)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73501909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档