2016-09-24 1 views
0

Hier ist mein Code. Idealerweise sollten sowohl struct.unpack und encode ('hex') als auch die Rückkehr zu int genau dasselbe sein?Wie dekodiert man eine 16-Bit-ASCII-Daten zu einer Ganzzahl, wenn Sie es in einer Zeichenfolge von 2 Zeichen in Python mit Struct-Modul haben?

INPUT -

Aber sie sind nicht das gleiche in diesem Fall, wenn Sie eine .wav-Datei geben mit nchannels = 1, samplewidth = 2, Framerate = 44100, COMPTYPE = "None" , compname = "Nicht komprimiert"

SAMPLE OUTPUT -

-15638 == EAC2 == 27330

-15302 3ac4 == == 15044

-14.905 c7c5 == == 18373

-14.449 8fc7 == == 4039

Die linken und rechten Handseite sollte gleich sein Recht?

import wave 
import sys 
import struct 

audiofile = wave.open(sys.argv[1], 'r') 
# reading a file (normal file open) 

print audiofile.getparams() 
# (nchannels, sampwidth, framerate, nframes, comptype, compname) 

for i in range(audiofile.getnframes()): 
    frame = audiofile.readframes(1) 
    # reading each frame (Here frame is 16 bits [.wav format of each frame]) 

    print struct.unpack('<h', frame)[0], ' == ', 
    # struct.unpack(fmt, string) --- for more info about fmt -> https://docs.python.org/2/library/struct.html 
    # If we it is two samples per frame, then we get a tuple with two values -> left and right samples 

    value = int(frame.encode('hex'), 16) 
    # getting the 16-bit value [each frame is 16 bits] 

    if(value > 32767): 
     value -= 2**16 
    # because wav file format specifies 2's compliment as in even the negative values are there 

    print frame.encode('hex') , ' == ', value 

audiofile.close() 
+0

Mit Ihrem Einzug scheint etwas falsch zu sein. Bitte repariere? – smarx

+0

Auch nicht sicher, was Ihre Frage ist. Vielleicht können Sie einen kürzeren Code-Ausschnitt angeben, seine Ausgabe teilen und die von Ihnen erwartete Ausgabe teilen. – smarx

+0

@smarx Ich habe eine Beispielausgabe hinzugefügt. Meine Hauptfrage ist, wenn ich Frame zu hex codiere und zurück zum int-Typ konvertiere und wenn ich struct-Modul verwende, um direkt den Wert von 16-Bits im int-Typ zu bekommen - Sie sollten gleich sein, oder? –

Antwort

0

Der Unterschied zwischen Big-Endian und Little-Endian-Codierung.

Ihre Struktur ist Big-Endian, während die Konvertierung mit Hex ist Little-Endian.

+0

Gemäß https://docs.python.org/2/library/struct.html bedeutet die Verwendung von "<", dass es sich um einen Little-Endian handelt –

Verwandte Themen