ich versuche jetzt schon seit geraumer Zeit eine .c4d-Datei richtig Auszulesen aber es will nicht klappen.
In der Doku für das Format steht geschrieben das die Dateien mit "Motorola Byte Order (Big Endian)" gespeichert werden und das die ersten 4 byte die Dateierkennung darstellen und die nächsten 4 Byte die Dateigröße beinhalten.
Alles gut und schön aber dann hört es auf. Ich lese die ersten 4 byte im TFileStream aus und dann die zweiten 4 Byte (in einen LongInt wie in der Doku beschrieben), jetzt noch schnell per swap() die Byte-Reihenfolge ändern und ausgeben.
Das Ergebnis kommt der Dateigröße noch nicht einmal nahe. Habe auch schon ohne swap probiert oder als HexCode hab es schon übergangen und die folgenden Werte probiert aber nichts klappt.
Nun wollt ich mal nachfragen ob jemand von euch mir weiterhelfen kann, ob ich was falsch mache oder ob jemand schonmal sowas gemacht hat?
Unter C/C++ würde ich dafür die Funktionen aus den Netzwerk-Sockets verwenden, also sowas wie htonl und ntohl, ich weiß jetzt nur nicht inwieweit Sockets in Delphi verfügbar sind.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also unter Windows kann man das Problemlos mit Stream.Read(Cardinal, 4) einlesen. Allerdings kann ich dir jetzt nicht gesagen ob das Big Endian oder Little Endian ist. Auf jeden Fall hilfreich ist immer ein Hexeditor in dem man sich auch mal anschauen kann wie es in der Datei aussieht. Wenn man dann sein gelesenes als Hex sieht fällt es eigentlich sofort ins Auge falls es nicht stimmt.
Ne funtzt irgend wie nicht aber trotzdem danke für die Antworten.
Es scheint nich am Code zu liegen sondern eher an der Duko die ich habe.
Es ist alles irgendwie anders. Naja dann werd ich wohl durch probieren heraus finden müssen was wohin gehört.
Vermutlich ist es das alte .c4d Format, das mit dem neuen nicht mehr kompatibel ist. Zumindest habe ich bislang keine Dokumentation des neuen Formates gesehen.
Hast du es schonmal mit einem signed 32bit integer bzw einem float versucht? Meist liegt der Ursprung bei den Programmen in der Mitte, und es können negative wie positive Werte entstehen. Ist jedenfalls bei Maya so und dem Obj Format.
Ja hab ich alles schon probiert.
Ich hab die Datentypen laut Doku genommen danach habe ich einmal jedes Word und dann noch jedes byte in alle Datentypen aus der Doku eingelesen aber ich habe keine übereinstimmung mit der Doku finden können.
Hab jetzt auch beschlossen das erstmal an den Nagel zu hängen und mich größerem zu widmen, ein eigener Modelleditor oder so .
Swap vertauscht das höherwertige mit dem niederwertigen Byte des mit X angegebenen Wertes. X ist ein Ausdruck des Typs SmallInt oder Word (16 Bit). Die Funktion ist nur aus Gründen der Abwärtskompatibilität vorhanden.
Beispiel: Swap($01020304)=$00000403
Alternative
Code:
function SwapDword(const x:integer):integer;
type TIntRecord=record
b1,b2,b3,b4:byte;
end;
begin
TIntRecord(result).b1:=TIntRecord(x).b4;
TIntRecord(result).b2:=TIntRecord(x).b3;
TIntRecord(result).b3:=TIntRecord(x).b2;
TIntRecord(result).b4:=TIntRecord(x).b1;
end;
Beispiel: SwapDword($01020304)=$04030201
Sollte also funktionieren.
Mitglieder in diesem Forum: Majestic-12 [Bot] und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.