< 返回版块

集合如何转换为普通数组?

xa87 发表于

集合如何转换为普通数组? = 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()

求大神指点,刚入门在写一个解密程序

评论区

loop 2018-10-29T10:23:21.214841

你这个我觉得直接用切片就行啊,类似jfile[100..200],得到的就是长度为100的slice然后就可以直接写入文件了。另外你这个读取文件的方式有点暴力啊,直接分配10M内存。当然10M不算太大,如果再大的话,应该就需要分段读了。

loop 2018-10-29T10:25:26.082271

不过都过了这么久了,你的问题应该已经解决了吧

作者 xa87 2018-10-29T12:46:28.838681

没解决啊, 求大神编译试试 最后一句出错

//======================================== 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);
*/

}

@loop 你这个我觉得直接用切片就行啊,类似jfile[100..200],得到的就是长度为100的slice然后就可以直接写入文件了。另外你这个读取文件的方式有点暴力啊,直接分配10M内存。当然10M不算太大,如果再大的话,应该就需要分段读了。

作者 xa87 2018-10-30T00:28:27.333853

谢谢大神,原来如此简单, jfile[100..200],

对,就是这样,我用take函数之后反而不行了。

@loop 不过都过了这么久了,你的问题应该已经解决了吧

作者 xa87 2018-10-30T00:33:08.510813

基础太差了,努力学习中

@loop 不过都过了这么久了,你的问题应该已经解决了吧

1 共 5 评论, 共 1 页