1 个不稳定版本
0.1.0 | 2021年5月21日 |
---|
#208 在 解析工具
21KB
138 行
原地字符串映射
有人说C在原地字符串修改方面比Rust更好。所以我创建了它。
use in_place_string_map::MapInPlace;
fn decode_percent(s: &mut str) -> &mut str {
let mut m = MapInPlace::new(s);
while let Some(c) = m.pop() {
match c {
'%' => {
let num = m.pop_chars(2).expect("not enough chars");
let n = u8::from_str_radix(num, 16).expect("invalid hex");
m.push(n as char).expect("no more capacity");
}
_ => {
m.push(c).expect("no more capacity");
}
}
}
m.into_mapped()
}
唯一需要注意的事情是不要推送比之前弹出的字节更多的字节。在这里这是可以的,因为%ff是2个字节长(最长可以是这样),但源文本使用了3个字节。当然,这样做并不不安全,你只是会失败推送。
有关其工作原理的更多详细信息可以在代码中找到(代码中有所注释)以及博客文章中。
错误/建议?
我在https://github.com/5225225/in-place-string-map上有一个仓库的镜像(这不是规范URL,它在https://git.5snb.club/5225225/in-place-string-map上的gitea托管)。请随意在github仓库中提出问题/拉取请求。或者,联系我(作者字段中的电子邮件,或阅读提交电子邮件)。