【问题标题】:Unpacking "0xff" vs. "\xff"解包“0xff”与“\xff”
【发布时间】:2013-09-22 03:41:10
【问题描述】:

我正在尝试使用波形库从波形文件中读取二进制数据。数据被读取并报告为 '\x0f\x06\x0a...' 形式的字符串文字,我想将十六进制数转换为整数(你知道,以十为基数)。我遇到的问题是这些字符串并没有真正被视为十六进制数字,而是有点像 unicode 字符。

import wave
import struct

path="C:\\directory\\file.wav"

file=wave.open(path,'r')
data=file.readframes(10)

print repr(data)

'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

int_dat=struct.unpack('10i',data)

当我尝试类似的东西时出现的错误

struct.unpack('i','\xff')

是 struct.unpack 期望一个长度为 4 的字符串,并且只接收一个长度为 1 的字符串。我很清楚为什么会发生这种情况,但是是否有 unpack 的格式选项可以让我解压 '\ xff'?

struct.unpack('i','0xff')

显然工作正常。同样

struct.unpack('i',r'\xff')

有效。

或者,是否可以方便地转换看起来像 '\xff\x01\x63...' 的字符串 到原始字符串(尽管我不确定这是否有意义,因为“\ x”被视为转义字符(这是正确的术语吗?)而不是字符),或形式为“0xff0x010x63”。

【问题讨论】:

  • 欢迎来到 SO 并为这个写得很好的问题 +1。
  • 输入的确切形式是什么?它实际上是否有前导单引号和尾随单引号?如果您添加了 print data 的确切输出,将会有所帮助。
  • 如果您添加了来自 print repr(data) 的输出,也会有所帮助。波形文件一开始就包含文本而不是原始二进制数据,这似乎非常奇怪。
  • 不幸的是,这很难添加。当我执行print data 时,会显示十个框(可能是因为文件以一堆零开头,这就是 \x00 被解释为的原因。在解释器中写入>>data 会产生>>'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
  • 粘贴来自print repr(data) 的输出。这只会产生可打印的字符。

标签: python


【解决方案1】:

好的,从 cmets 可以清楚地看出这是一个二进制文件,而不是字符串文字文件。没关系 - 我们期望.wav 文件是二进制数据。

先将open()模式改为rb

然后,如果你读取 10 个字节,你可以通过

struct.unpack('10b', data)

这将返回一个 10 个整数的元组。你快到了;-)

【讨论】:

    【解决方案2】:

    ord() 会将字节串元素转换为其对应的值。

    >>> ord('\x0f')
    15
    

    或者使用适当大小的struct 转换。

    >>> struct.unpack('b', '\x0f')
    (15,)
    

    【讨论】:

    • 看来struct.unpack('20b',data)是我需要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-04-28
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 2014-10-16
    • 2017-03-21
    • 2016-02-05
    相关资源
    最近更新 更多