13

I assign a value to a variable x in the following way:

import wave
w = wave.open('/usr/share/sounds/ekiga/voicemail.wav', 'r')
x = w.readframes(1)

When I type x I get:

'\x1e\x00'

So x got a value. But what is that? Is it hexadecimal? type(x) and type(x[0]) tell me that x and x[0] a strings. Can anybody tell me how should I interpret this strings? Can I transform them into integer?

SilentGhost
  • 264,945
  • 58
  • 291
  • 279
Roman
  • 97,757
  • 149
  • 317
  • 426

4 Answers4

7

The interactive interpreter echoes unprintable characters like that. The string contains two bytes, 0x1E and 0x00. You can convert it to an integer with struct.unpack("<h", x) (little endian, 2 bytes, signed).

AndiDog
  • 62,237
  • 17
  • 152
  • 196
  • How would you convert an array of integers back to string in the same format after this? – quano May 07 '11 at 10:09
  • @quano: Arrays have the [`.tostring()`](http://docs.python.org/library/array.html#array.array.tostring) method. For simple sequences, you can use `struct.pack("<4H", 1, 2, 3, 4)`. numpy should also have similar methods. – AndiDog May 07 '11 at 10:42
  • Should be " – Jyaif May 05 '21 at 13:47
3

Yes, it is in hexadecimal, but what it means depends on the other outputs of the wav file e.g. the sample width and number of channels. Your data could be read in two ways, 2 channels and 1 byte sample width (stereo sound) or 1 channel and 2 byte sample width (mono sound). Use x.getparams(): the first number will be the number of channels and the second will be the sample width.

This Link explains it really well.

I'm Geeker
  • 4,642
  • 5
  • 19
  • 40
Razzad777
  • 395
  • 1
  • 3
  • 9
1

It's a two byte string:

>>> x='\x1e\x00'
>>> map(ord, list(x))
[30, 0]
>>> [ord(i) for i in x]
[30, 0]
Andrew McGregor
  • 24,492
  • 2
  • 26
  • 28
0

This strings represent bytes. I guess you can turn them into an integer with struct package, which allows interpreting strings of bytes.

gruszczy
  • 37,239
  • 27
  • 119
  • 167