2011-12-31 15 views
6

Mam plik binarny, który jest naprawdę stos plików, format jest:Jak mogę odczytać plik BufferedFile za pomocą read (bufora ubyte []), gdy długość bufora jest ustawiona w czasie wykonywania?

lengh_of_subfile,subfile 

length_of_subfile jest 64-bitową liczbą całkowitą. Mogę odczytać long bez problemu, ale gdy próbuję utworzyć bufor dla fragmentu, otrzymuję błędy kompilacji mówiąc, że nie można go odczytać w czasie kompilacji. czego mi brakuje? Napisałem identyczne narzędzie do ekstrakcji w erlangu, PHP i C# ... D rzuca mnie na pętlę.

void main(string args[]) { 
    Stream file = new BufferedFile(args[1], FileMode.In); 
    int counter = 0; 
    while(file.position < file.size) { 
     ulong len; 
     file.read(len); 
     ubyte[len] ogg; 
     file.read(ogg); 
     string outname = getcwd() ~ "/" ~ to!string(counter) ~ ".ogg"; 
     Stream oggout = new BufferedFile(outname, FileMode.OutNew); 
     oggout.write(ogg); 
     writefln("Creating file " ~ to!string(counter) ~ ".ogg"); 
     counter++; 
    } 
} 
+2

Potrzebujesz [tablica dynamiczna] (http: // stackoverflow.com/questions/8363728/d-dynamic-array-initialization-stride-and-tind-index-operation). (Nie mam pojęcia jak, bo nie programuję w D) – Ryan

Odpowiedz

7

Zamiast

 ubyte[len] ogg; 

zapisu

 ubyte[] ogg = new ubyte[len]; 
+0

Doskonałe dzięki. – b0redom

1

Można użyć tablicę o długości dynamicznego lub po prostu użyć nowy, aby utworzyć nową tablicę ubyte:

new ubyte[len] 
2

odciąć to, co chcesz wypełnić

ubyte[1024*8] ogg; 
ogg=ogg[0..len] 
file.read(ogg); 

, lub pętlę uczynić kopiowanie (w 2^64 bajtów tablicy przyzwyczajenie mieszczą się w pamięci)

ubyte[1024*16] ogg; 
while(len>0 && (int read=file.read(ogg[0..$>len?len:$]))!=0){ 
    oggout.write(ogg[0..read]); 
    len-=read;//len is the amount still to be read 
} 

marginesie writeln("Creating file ",counter, ".ogg"); jest bardziej wydajny niż concat następnie zapisać (sposób Java) ponieważ nie tworzy niepotrzebnych ciągów (a tworzenie ciągu formatu w środowisku wykonawczym prosi o błąd wcześniej lub później na pierwszym %, którego nie uwzględniasz)

Powiązane problemy