模块结构需要啥格式?

Posted

技术标签:

【中文标题】模块结构需要啥格式?【英文标题】:What format does the module Struct require?模块结构需要什么格式? 【发布时间】:2021-11-16 23:44:41 【问题描述】:

我第一次遇到模块结构,我的代码给了我一个错误:“解包需要 1486080 字节的缓冲区” 这是我的代码:

def speed_up(n):
source = wave.open('sound.wav', mode='rb')
dest = wave.open('out.wav', mode='wb')
dest.setparams(source.getparams())
frames_count = source.getnframes()
data = struct.unpack("<" + str(frames_count) + "h", source.readframes(frames_count))
new_data = []
for i in range(0, len(data), n):
    new_data.append(data[i])
newframes = struct.pack('<' + str(len(new_data)) + 'h', new_data)
dest.writeframes(newframes)
source.close()
dest.close()

如何确定我应该使用哪种格式?

【问题讨论】:

你检查过你传递给unpack的对象的类型和大小吗? @interjay,是的,我检查过了,输入 - 'bytes',大小 - '2972193'。现在我看到了我的错误——frames_count 的值是 743040,并且格式与缓冲区不匹配。我尝试将格式设置为“ 那个大小对我来说没有意义,因为它不能被 2 整除。你从 unpack 得到的错误表明它不是字节对象的实际大小。 对不起,现在我用 'sys.getsizeof(source.readframes(frames_count))' 得到了实际大小,大小是 33 字节。但无论如何我无法意识到,我应该使用哪种格式。 getsizeof 几乎没有用处。您可以使用len 获取数据的实际长度。您需要考虑 wav 文件的样本宽度(指示在 struct.unpack 中使用的格式,以及通道数(每帧的样本数)。 【参考方案1】:

您的代码中的问题是您为struct.unpack 提供了错误的字节数。这是因为您使用了wave 模块:wave 文件中的每一帧都有getnchannels() 样本,因此当调用readframes(n) 时,您将返回n * getnchannels() 样本,这是您必须通过的数字到struct.unpack

为了使您的代码更加健壮,您还需要查看getsampwidth() 并使用适当的格式字符,但绝大多数波形文件都是 16 位的。

在 cmets 中,您还提到添加 print(len(source.readframes(frames_count))) 后代码不起作用。您没有显示完整的代码,但我认为这是因为您调用了两次readframes 而没有调用rewind,所以第二次调用没有更多数据可以返回。如果要在多行中使用结果,最好将结果存储在变量中。

【讨论】:

以上是关于模块结构需要啥格式?的主要内容,如果未能解决你的问题,请参考以下文章

需要啥安全访问模块 (SAM)?

json是啥意思

如果有的话,您需要向依赖类型系统添加啥来获得模块系统?

在 BillingService 模块中,需要修改啥来增加安全性?

RequireJS 啥时候需要异步调用?啥时候同步?

Express Payments rails 模块需要啥样的 PayPal 沙盒帐户?