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

自作多情 提交于 2019-12-10 13:30:47

问题


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++;
    }   
}

回答1:


Instead of

        ubyte[len] ogg;

write

        ubyte[] ogg = new ubyte[len];



回答2:


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)




回答3:


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

new ubyte[len]


来源:https://stackoverflow.com/questions/8690759/how-do-i-read-a-bufferedfile-using-readubyte-buffer-when-the-buffer-length-i

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!