集合如何转换为普通数组?
= note: expected type &[u8]
found type &std::iter::Take<std::slice::Iter<'_, u8>>
//读取的数据文件10M,因为文件较大,不能用普通数组,否则会栈溢出,所以只能用静态数组 static mut jfile:[u8;1024102410]=[0;1024102410]; //读取代码,运算处理 let a2=jfile.iter().take(len); //提取其中某一段数据 //现在要将其写入文件 file3.write(&a2); //报错,不支持写入
/*
file3.write(&a2);
^^^ expected slice, found struct std::iter::Take
*/
单字节一字节写是可以的,因为File写入只能是普通的数组 &[u8]
单字节写入效率太慢,我文件大,还要运算,现有足足有20多秒,
将整个数组整体写入,求指点,如何将一个类似于List的集合转换为普通数组
类似于C# 的List.ToArray()
求大神指点,刚入门在写一个解密程序
1
共 5 条评论, 1 页
评论区
写评论基础太差了,努力学习中
谢谢大神,原来如此简单, jfile[100..200],
对,就是这样,我用take函数之后反而不行了。
没解决啊, 求大神编译试试 最后一句出错
//======================================== use std::fs::File; use std::io::Read; use std::io::SeekFrom; use std::env; use std::io::Seek; use std::io::Write; use std::io::BufWriter; use std::ptr; fn main() {
if env::args().len()>2 { println!("参数过多,错误!"); return; } //字典10M static mut dict:[u8;1024*1024*10]=[0;1024*1024*10]; //加文件 static mut jfile:[u8;1024*1024*10]=[0;1024*1024*10]; let mut file1 = match File::open("dict.bin") { Ok(file1) => file1, Err(e) => { println!("未找到字典文件 dict.bin ,失败 :{}",e); return; } }; unsafe{ let len=match file1.read(&mut dict){ Ok(len)=>len, Err(e)=>{ println!("读取字典文件出错:{}",e); return; } }; println!("读取字典文件{}字节",len); } //获取命令行参数 let file2_name= match env::args().nth(1){ Some(file2_name)=>file2_name, None=>{ println!("参数无效!"); return; } }; //读取目标文件 let mut file2 = match File::open(&file2_name) { Ok(file2) => file2, Err(e) => { println!("打开目标文件错误:{}",e); return; } }; //println!("{:?}",file2); file2.seek(SeekFrom::Start(1024)); match file2.seek(SeekFrom::Start(1024)){ Ok(len)=>len, Err(e)=>{ println!("文件过小,无需操作 :{}",e); return; } }; //写入目标文件 let mut file3=match File::create(file2_name + &".new"){ Ok(file3) => file3, Err(e) => { println!("打开新文件错误:{}",e); return; } }; //===================新方法 unsafe{ //读取加文件 let len=match file2.read(&mut jfile){ Ok(len)=>len, Err(e)=>{ println!("读取文件错误:{}",e); return; } }; //解运算 let mut b=0u8; for i in 0..len{ b=jfile[i]; // ^ &dict[i] ^ ((i % 256) as u8); } let a2=jfile.take(len); //.into_iter().truncate(5);//as_slice(); truncate //ptr.copy(&a2,) //let a3=&mut a2[..]; //let mut stream= BufWriter::new(file3); //stream.write(&a2); /* for b in a2{ println!("{}",b); }*/ file3.write(&a2); //println!("{:?}/",a2); } //=========================== //f1密钥 f2原加文件 f3新解文件 //原慢处理方法 /* let mut dat:Vec<u8>=Vec::new(); unsafe{ let mut byte:[u8;1]=[0;1]; let mut i=0; loop{ match file2.read(&mut byte){ Ok(len)=>{ if len==0{ println!("操作完毕!共{}字节",i); break; } } Err(e)=>{ println!("写新文件错误:{}",e); return; } }; byte[0]=byte[0] ^ &dict[i] ^ ((i % 256) as u8); dat.push(byte[0]); //file3.write(&byte); i+=1; } } file3.write(&dat); */
}
不过都过了这么久了,你的问题应该已经解决了吧
你这个我觉得直接用切片就行啊,类似jfile[100..200],得到的就是长度为100的slice然后就可以直接写入文件了。另外你这个读取文件的方式有点暴力啊,直接分配10M内存。当然10M不算太大,如果再大的话,应该就需要分段读了。