Ich habe große Probleme mit struct.unpack
in Python. Ich habe eine Binärdatei mit einem vorgegebenen Format, das entweder in MATLAB oder in Python geschrieben werden kann.Analysieren einer in MATLAB geschriebenen Binärdatei von Python und umgekehrt
Ich kann Binärdaten in eine Datei in Python schreiben und die Daten ohne Probleme zurück lesen. Ich kann dieselben Daten auch von MATLAB in eine Binärdatei schreiben und sie ohne Probleme in MATLAB zurücklesen.
Mein Problem kommt, wenn ich entweder die Daten aus MATLAB schreibe und versuche, es wieder in Python zu lesen, oder wenn ich die Daten in Python schreibe und versuche, es wieder in MATLAB zu lesen.
Zur Vereinfachung sagen wir, ich schreibe zwei ganze Zahlen in eine Binärdatei (Big-Endian). Jede Ganzzahl ist 4 Bytes. Die erste Ganzzahl ist eine gültige ganze Zahl nicht größer als 4 Bytes, und die zweite ganze Zahl gleich sein muss entweder 1, 2 oder 3.
Als erstes ist hier, wie ich meine Daten in MATLAB schreiben:
fid=fopen('hello_matlab.test','wb');
first_data=4+4;
second_data=1;
fwrite(fid,first_data,'int');
fwrite(fid,second_data,'int');
fclose(fid);
Und hier ist, wie ich das zurück in MATLAB lesen:
fid=fopen('hello_matlab.test','rb');
first_data=fread(fid,1,'int');
second_data=fread(fid,1,'int');
fprintf('first data: %d\n', first_data);
fprintf('second data: %d\n', second_data);
fclose(fid);
>> first data: 8
>> second data: 1
Nun, hier ist, wie ich die Daten in Python schreiben:
fid=open('hello_python.test','wb')
first_data=4+4
second_data=1
fid.write(struct.pack('>i',first_data))
fid.write(struct.pack('>i',second_data))
fid.close()
Und hier ist, wie ich diese Daten in Python wiedergelesen habe. Beachten Sie auch, dass der auskommentierte Teil funktionierte (beim Lesen von in Python geschriebenen Dateien). Ursprünglich dachte ich, etwas seltsam war mit der Art und Weise geschieht struct.calcsize('>i')
berechnet wurde, so dass ich es entnommen und stattdessen eine hartcodierte Konstante, INTEGER_SIZE
, um die Menge von Bytes darstellen Ich wusste MATLAB verwendet hatte, als es kodiert:
INTEGER_SIZE=4
fid=open('hello_python.test','rb')
### FIRST WAY I ORIGINALLY READ THE DATA ###
# This works, but I figured I would try hard coding the size
# so the uncommented version is what I am currently using.
#
# first_data=struct.unpack('>i',fid.read(struct.calcsize('>i')))[0]
# second_data=struct.unpack('>i',fid.read(struct.calcsize('>i')))[0]
### HOW I READ DATA CURRENTLY ###
first_data=struct.unpack('>i',fid.read(INTEGER_SIZE))[0]
second_data=struct.unpack('>i',fid.read(INTEGER_SIZE))[0]
print "first data: '%d'" % first_data
print "second data: '%d'" % second_data
fid.close()
>> first data: 8
>> second data: 1
Jetzt sagen wir, ich möchte hello_python.test
in MATLAB lesen. Mit meinem aktuellen MATLAB-Code, hier ist die neue Ausgabe:
>> first data: 419430400
>> second data: 16777216
Das ist seltsam, also habe ich das Gegenteil getan. Ich habe geschaut, was passiert, wenn ich hello_matlab.test
lese. Mit meinem aktuellen Python-Code, hier ist die neue Ausgabe:
>> first data: 419430400
>> second data: 16777216
Also, etwas Seltsames passiert, aber ich weiß nicht, was es ist. Beachten Sie bitte, obwohl dies Teil eines größeren Projekts ist, habe ich nur diese Teile meines Codes in ein neues Projekt extrahiert und das obige Beispiel mit diesen Ergebnissen getestet. Ich bin wirklich verwirrt, wie diese Datei tragbar machen :(Jede mögliche Hilfe würde geschätzt
Ich sehe nichts im MATLAB-Code, der anzeigen würde, dass Sie die Werte im Big-Endian-Format schreiben; Ich vermute, dass sie im Little-Endian-Format geschrieben sind, also wenn Sie mit dem Python-Code lesen, wollen Sie lieber als . –
Was ist das Ergebnis nach dem Schreiben der gesamten MATLAB-Datei, wenn Sie diese Datei in Python öffnen und einen einfachen 'fid.read()' ausführen, um den gesamten Inhalt zu lesen? –
Hilft das? http://stackoverflow.com/questions/874461/read-mat-files-in-python – cdarke