gpt4 book ai didi

rust - 使用 Hyper 和 Flate2 读取 gzip 响应

转载 作者:行者123 更新时间:2023-11-29 08:07:54 24 4
gpt4 key购买 nike

Hyper 具有函数 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize>将 HTTP 响应的内容读入提供的 &mut [u8] .

Flate2 可以压缩:

let mut d = GzDecoder::new("...".as_bytes()).unwrap();
let mut s = String::new();
d.read_to_string(&mut s).unwrap();
println!("{}", s);

我试着把这两件事放在一起:

fn gunzip(r: &Response) -> String {
let mut zs: &mut [u8] = &mut[];
r.read(zs);
let mut d = GzDecoder::new(zs).unwrap();
let mut s = String::new();
d.read_to_string(&mut s).unwrap();
s
}

我得到了错误:

error[E0277]: the trait bound `[u8]: std::io::Read` is not satisfied
--> tests/integration.rs:232:21
|
232 | let mut d = GzDecoder::new(zs).unwrap();
| ^^^^^^^^^^^^^^ trait `[u8]: std::io::Read` not satisfied
|
= help: the following implementations were found:
= help: <&'a [u8] as std::io::Read>
= note: required because of the requirements on the impl of `std::io::Read` for `&mut [u8]`
= note: required by `<flate2::read::DecoderReader<R>>::new`

我哪里错了?


编辑:最终的工作解决方案:

fn gunzip(r: &mut Response) -> String {
let mut buffer = Vec::new();
let _ = r.read_to_end(&mut buffer).unwrap();
let mut d = GzDecoder::new(buffer.as_slice()).unwrap();
let mut s = String::new();
d.read_to_string(&mut s).unwrap();
s
}

最佳答案

GzDecoder::new 的参数是用泛型类型定义的,因此 Rust 不会执行某些在需要固定类型时会发生的转换。

您可以通过取消引用可变切片然后引用结果来将可变切片转换为不可变切片。

let mut d = GzDecoder::new(&*zs).unwrap();

关于rust - 使用 Hyper 和 Flate2 读取 gzip 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40294929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com