3

Wave ライブラリを使用して Wavefile からバイナリ データを読み込もうとしています。データは '\x0f\x06\x0a...' の形式の文字列リテラルとして読み取られ、報告されます。16 進数を整数に変換したいと思います (基数 10)。私が抱えている問題は、これらの文字列が実際には 16 進数として扱われておらず、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 の文字列しか受け取っていないということです。なぜそうなっているのかは明らかですが、「\xff」を解凍できる unpack のフォーマット オプションはありますか?

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

明らかにうまく動作します。同様に

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

動作します。

または、「\xff\x01\x63...」のような文字列を生の文字列に変換する便利な方法はありますか (ただし、「\x」はエスケープ文字 (正しい用語ですか?) であり、文字ではありません)、または '0xff0x010x63' の形式にします。

4

2 に答える 2

1

OK、コメントから、これが文字列リテラルのファイルではなく、バイナリ ファイルであることは明らかです。これで問題ありません。ファイルはバイナリ データであると想定しています。.wav

open()モードをrb最初に変更します。

次に、10バイトを読み取った場合は、次の方法で解凍できます

struct.unpack('10b', data)

これは、10 個の整数のタプルを返します。あなたはほとんどそこにいます;-)

于 2013-09-22T04:08:05.067 に答える
0

ord()バイト文字列要素を対応する値に変換します。

>>> ord('\x0f')
15

または、適切なサイズのstruct変換を使用します。

>>> struct.unpack('b', '\x0f')
(15,)
于 2013-09-22T03:44:00.357 に答える