2011-12-31 10 views
6

Tengo un archivo binario que es realmente una pila de archivos, el formato es:¿Cómo leo un BufferedFile usando read (ubyte [] buffer) cuando la longitud del buffer se establece en tiempo de ejecución?

lengh_of_subfile,subfile 

length_of_subfile es un número entero de 64 bits. Puedo leer el long sin problemas, pero cuando trato de crear un búfer para el subarchivo recibo errores de compilación que dicen que no se puede leer en tiempo de compilación. ¿Qué me estoy perdiendo? He escrito una herramienta de extracción idéntica en erlang, PHP y C# ... D me está tirando por un bucle.

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

Necesita una [matriz dinámica] (http: // stackoverflow.com/questions/8363728/d-dynamic-array-initialization-stride-and-the-index-operation). (No tengo idea de cómo, sin embargo, porque no programo en D) – Ryan

Respuesta

7

En lugar de

 ubyte[len] ogg; 

escritura

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

Perfecto gracias. – b0redom

1

Se puede usar un array con longitud dinámica o simplemente utilizar nueva para crear una nueva matriz UBYTE:

new ubyte[len] 
2

cortar lo que quieras llenar

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

o utilizar un bucle para hacer la copia (como una matriz de bytes 2^64 costumbre ajuste en la memoria)

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 
} 

lado nota writeln("Creating file ",counter, ".ogg"); es más eficiente que concat entonces escribir (la forma java) porque no crea cadenas inútiles (y la creación de la cadena de formato en el tiempo de ejecución está solicitando un error tarde o temprano en el primer % no se tiene en cuenta)

Cuestiones relacionadas