在运行时设置缓冲区长度时,如何使用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
}