在运行时设置缓冲区长度时,如何使用read(ubyte[]buffer)读取缓冲区文件?

在运行时设置缓冲区长度时,如何使用read(ubyte[]buffer)读取缓冲区文件?,d,D,我有一个二进制文件,它实际上是一堆文件,格式是: lengh_of_subfile,subfile 子文件的长度是64位整数。我可以读取long没有问题,但是当我尝试为子文件创建缓冲区时,我得到编译错误,说它在编译时无法读取。我错过了什么?我已经用erlang、PHP和C#编写了一个相同的提取工具。。。D把我甩了一圈 void main(string args[]) { Stream file = new BufferedFile(args[1], FileMode.In);

我有一个二进制文件,它实际上是一堆文件,格式是:

lengh_of_subfile,subfile
子文件的长度是64位整数。我可以读取
long
没有问题,但是当我尝试为子文件创建缓冲区时,我得到编译错误,说它在编译时无法读取。我错过了什么?我已经用erlang、PHP和C#编写了一个相同的提取工具。。。D把我甩了一圈

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++;
    }   
}
void main(字符串参数[]){
流文件=新的缓冲文件(args[1],FileMode.In);
int计数器=0;
while(file.position
您可以使用具有动态长度的数组,也可以使用new创建新的ubyte数组:

new ubyte[len]
而不是

        ubyte[len] ogg;


把你要填的东西切掉

ubyte[1024*8] ogg;
ogg=ogg[0..len]
file.read(ogg);
或者使用循环进行复制(因为2^64字节数组不适合内存)

旁注
writeln(“创建文件”,计数器,.ogg”)
比concat-then-write(java方式)更高效,因为它不会创建无用的字符串(并且在运行时创建格式字符串会在第一次
%%
时要求迟早出错)

您需要一个。(不过我不知道怎么做,因为我不使用D语言编程)
ubyte[1024*8] ogg;
ogg=ogg[0..len]
file.read(ogg);
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
}