Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do i read a BufferedFile using read(ubyte[] buffer) when the buffer length is set at runtime?

Tags:

d

I have a binary file that is really a stack of files, the format is:

lengh_of_subfile,subfile

length_of_subfile is a 64-bit integer. I can read the long no problem but when I try to create a buffer for the subfile I get compile errors saying it cannot be read at compile time. What am I missing? I've written an identical extraction tool in erlang, PHP and C#... D is throwing me for a loop.

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++;
    }   
}
like image 740
b0redom Avatar asked Dec 31 '11 21:12

b0redom


3 Answers

Instead of

        ubyte[len] ogg;

write

        ubyte[] ogg = new ubyte[len];
like image 179
ruakh Avatar answered Oct 29 '22 09:10

ruakh


slice off what you want to fill

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

or use a loop to do the copying (as a 2^64 byte array wont fit in memory)

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
}

side note writeln("Creating file ",counter, ".ogg"); is more efficient than concat then write (the java way) because it doesn't create useless strings (and creating the format string at runtime is asking for a error sooner or later on the first % you don't account for)

like image 20
ratchet freak Avatar answered Oct 29 '22 10:10

ratchet freak


You could use a array with dynamic length or just use new to create a new ubyte array:

new ubyte[len]
like image 32
dav1d Avatar answered Oct 29 '22 10:10

dav1d