如何打印一个充满"混乱问号的字符串的值"

时间:2014-04-08 03:41:20

标签: python audio

我正在使用python音频进行调试,对音频编码很难。

这里我有一个充满音频数据的字符串,比如说[10,20,100]。

但是数据存储在字符串变量

data = "����������������"

我想检查这个字符串的值。

以下是我尝试过的事情

打印为int

我尝试使用print "%i" % data[0]

结束了
 Traceback (most recent call last):
   File "wire.py", line 28, in <module>
     print "%i" % data[i]
 TypeError: %d format: a number is required, not str

转换为int

int(data[0])最后以

结束
Traceback (most recent call last):
  File "wire.py", line 27, in <module>
    print int(data[0])
ValueError: invalid literal for int() with base 10: '\xd1'

对此有何想法?我想以数字方式打印字符串,因为字符串实际上是一个声波阵列。

修改

您的所有答案都非常有用。

该字符串实际上是从麦克风生成的,因此我认为它是原始波形或振动数据。此外,这应该参考音频API文档PortAudio

在查看PortAudio之后,我找到了这个有用的例子。

** This routine will be called by the PortAudio engine when audio is needed.
** It may called at interrupt level on some machines so don't do anything
** that could mess up the system like calling malloc() or free().
static int patestCallback( const void *inputBuffer, void *outputBuffer,
                            unsigned long framesPerBuffer,
                            const PaStreamCallbackTimeInfo* timeInfo,
                            PaStreamCallbackFlags statusFlags,
                            void *userData )
{
    paTestData *data = (paTestData*)userData;
    float *out = (float*)outputBuffer;
    unsigned long i;

    (void) timeInfo; /* Prevent unused variable warnings. */
    (void) statusFlags;
    (void) inputBuffer;

    for( i=0; i<framesPerBuffer; i++ )
    {
        *out++ = data->sine[data->left_phase];  /* left */
        *out++ = data->sine[data->right_phase];  /* right */
        data->left_phase += 1;
        if( data->left_phase >= TABLE_SIZE ) data->left_phase -= TABLE_SIZE;
        data->right_phase += 3; /* higher pitch so we can distinguish left and right. */
        if( data->right_phase >= TABLE_SIZE ) data->right_phase -= TABLE_SIZE;
    }

    return paContinue;
}

这表明我可以通过某种方式将数据解释为float

4 个答案:

答案 0 :(得分:3)

要清楚,您的音频数据是一个字节字符串。字节字符串表示存储在音频文件中的字节。您不会简单地将这些字节转换为有意义的值,而不必先了解二进制文件中的内容。

作为一个例子,mp3规范说每个mp3包含标题帧(在此描述:http://en.wikipedia.org/wiki/MP3)。要读取标题,您需要使用bitstring之类的内容,或者如果您觉得自己习惯于按位操作,那么您只需要解包一个整数(4个字节)并进行一些数学运算来计算出值32个人的比特。

这完全取决于您尝试阅读的内容以及数据的生成方式。如果你有完整的字节数,那么struct将很好地为你服务。

答案 1 :(得分:1)

如果您对上面提到的\xd1感到满意:

for item in data: print repr(item), 

请注意,for x in data将迭代列表中的每个值而不是其位置。如果您需要该位置,可以使用for i in range(len(data)): ...

如果您想要数字形式,请将repr(item)替换为ord(item)

答案 2 :(得分:0)

最好使用新的{}.format方法:

data = "����������������"

print '{0}'.format(data[3])

答案 3 :(得分:0)

您可以使用ord将每个字节映射到0-255之间的数值:

print map(ord, data)

或者,对于Python 3兼容性,请执行:

print([ord(c) for c in data])

它也可以使用Unicode字形,这可能不是您想要的,因此请确保在Python 2中有一个bytearray或一个实际的strbytes对象。