生锈 如何用字节参数对字符串进行编码?



我有一些参数,如下所示:

{'peer_id': '-PC0001-781232119400', 'port': 6889, 'event': 'started', 'compact': 1, 'left': 2097152000, 'uploaded': 0, 'info_hash': b'xd5@xfcHxebx12xf2x831cxeexd6Bx1dDx9dxd8xf1xcex1f', 'downloaded': 0}

我想把它全部编码成一个字符串,如下所示:

my_url?peer_id=-PC0001-781232119400&port=6889&event=started&compact=1&left=1&uploaded=0&info_hash=%D5%40%FCH%EB%12%F2%831c%EE%D6B%1DD%9D%D8%F1%CE%1F&downloaded=0"

我已经玩了urlcode并提出了这个:

extern crate url;
use url::form_urlencoded;
fn main() {
let encoded: String = form_urlencoded::Serializer::new(String::new())
.append_pair("foo", "bar & baz")
.append_pair("saison", "Été+hiver")
.finish();
println!("{:?}", encoded);
}

问题是,apprend_pair接收一对&'str- 它不接收字节...我不知道如何实现我的目标。

在python中,我只需使用内置from urllib.parse import urlencode 并执行urlencode(params)

这有点黑客,但你可以覆盖通过闭包对值进行编码的方式,因此,你将能够以这种方式潜入二进制值。我使用"!"来指示在下面的示例中替换二进制值的位置,但您实际上可以使用任何东西:

fn main() {
let binary = vec![0, 1, 2, 3];
let encoded = form_urlencoded::Serializer::new(String::new())
.append_pair("foo", "bar & baz")
.append_pair("saison", "Été+hiver")
.encoding_override(Some(&|input| {
if input != "!" {
// Return the actual value ("info_hash", in this particular case)
Cow::Borrowed(input.as_bytes())
} else {
// When "!" is seen, return the binary data instead
Cow::Owned(binary.clone())
}
}))
.append_pair("info_hash", "!")
.finish();
println!("{:?}", encoded);
}

这输出

"foo=bar+%26+baz&saison=%C3%89t%C3%A9%2Bhiver&info_hash=%00%01%02%03">

你可以在这里尝试一下:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=805d80ebbc98909fa32177030102ba12

最新更新