wetransfer'e üye olmak istemediğimden Excel dosyasını göremedim ama sanırım daha önce baktığımız .ct dosyası sayfası yeterli olmalı. Tembellik ettim ve VuEntity yapısını tamamlamadım ama gerisi senin için kolay olmalı: 4 bayt için int veya uint, 2 bayt için short veya ushort, 1 bayt için byte veya ubyte, vs.
import std.stdio;
import std.string;
import std.exception;
// Bkz: https://pmc.editing.wiki/doku.php?id=falcon4:file_formats:ct_file
align(1)
struct VuEntity {
align(1):
ushort id;
ushort collisionType;
float collisionRadius;
byte[8] classInfo;
// vs....
// Bütün türleri yazmak istemediğimden bu türün büyüklüğünü
// belgede belirtilen 60'a tamamlıyorum
byte[44] doldurma;
}
// Denetleyelim
static assert (VuEntity.sizeof == 60);
align(1)
struct Falcon4Entity {
align(1):
VuEntity vuClassData;
short[7] visType;
short vehicleDataIndex;
byte dataType;
uint dataPtr;
}
// Denetleyelim
static assert ((Falcon4Entity[2]).sizeof == 81 * 2);
Falcon4Entity[] oku(string dosyaİsmi) {
auto dosya = File(dosyaİsmi, "rb");
short adet;
auto okunanAdet = dosya.rawRead((&adet)[0..1]);
enforce(okunanAdet.length == 1, "HATA: Adet değerini okuyamadım");
writefln("%s adet nesne okuyorum", adet);
auto entries = new Falcon4Entity[](adet);
auto okunanEntries = dosya.rawRead(entries);
enforce(okunanEntries.length == adet,
format("HATA: %s yerine yalnızca %s nesne okudum", adet, okunanEntries.length));
return entries;
}
int main(string[] args) {
if (args.length != 2) {
stderr.writefln("Kullanım: %s <dosya ismi>", args[0]);
return 1;
}
Falcon4Entity[] entries = oku(args[1]);
writefln("Elimde %s adet nesne var: %s", entries.length, entries);
return 0;
}
Ancak, daha önce de konuştuğumuz endianness konusu hâlâ geçerli. Bu tür bir okuma ancak okuyan bilgisayar dosyayla uyuştuğunda doğrudur.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]