很抱歉,这个简单的问题,但它被大脑吹了,因为我不擅长数据结构。
首先,我有一个包含压缩原始数据的初始二进制文件。我的同事帮助我将字节转化为Python中的一个小数数组(下面给出了代码,工作得很好,将结果显示为Python中的图表)。
现在,我想做相反的操作,例如,将一个十进制数字数组转换成一个二进制文件,但是我完全被困住了。非常感谢您提前!
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()发布于 2022-08-26 19:44:37
原始字节流被编码为一个或四个字节整数.第一个值以四字节整数的形式发送.在第一个值之后,要么在0..254范围内有一个字节,这表示-127到127之间的差异,要么有255后面跟着四个字节的带符号的小对数值,这是下一个值(不是差异)。其思想是,如果整数从一个缓慢地变化到另一个,这将通过发送一个字节而不是4个字节来将序列压缩到4倍。虽然如果您有太多的差异不适合一个字节,这可能会将数据扩展25%,因为无差异的值需要5个字节而不是4个字节。
要对这样的流进行编码,首先直接将第一个值编码为4个字节,即小endian。对于每个后续值,从这个值中减去前一个值。如果结果在-127到127之间,则添加127并发送该字节。否则,发送255个字节,后面跟着值(而不是差值),作为一个4字节有符号的小对数值。
正如@灰胡子所指出的,同事的代码(假设它在这里被正确复制)中有一个错误,即res没有初始化。第一点解码需要:
# decode 1st point
res = int.from_bytes(data_in[0:4], byteorder='big', signed=True)
data_out.append(res)https://stackoverflow.com/questions/73501909
复制相似问题