http - 如何拆分 Vec通过一系列字符?
问题描述
我想将 HTTP 请求的有效负载提取为Vec<u8>
. 在请求中,有效载荷通过序列与其余部分分开\r\n\r\n
,这就是为什么我想Vec
在这个位置拆分我的,并取第二个元素。
我目前的解决方案是使用我编写的以下函数。
fn find_payload_index(buffer: &Vec<u8>) -> usize {
for (pos, e) in buffer.iter().enumerate() {
if pos < 3 {
continue
}
if buffer[pos - 3] == 13 && buffer[pos - 2] == 10 && buffer[pos - 1] == 13 && buffer[pos] == 10 {
return pos + 1;
}
}
0
}
13
是 的 ASCII 值\r
和10
的值\n
。然后我按返回的索引进行拆分。虽然这个解决方案在技术上是可行的,但感觉很不干净,我想知道如何以更优雅的方式做到这一点。
解决方案
首先:
函数几乎不应该有
&Vec<_>
参数。请参阅为什么不鼓励接受对 String (&String)、Vec (&Vec) 或 Box (&Box) 的引用作为函数参数?.
不要使用魔法值 10 和 13,Rust 支持字节文字:
b'\r'
和b'\n'
.
至于您的问题:我相信您可以使用字节字符串文字模式使其变得windows
更简单:matches!
fn find_payload_index(buffer: &[u8]) -> Option<usize> {
buffer
.windows(4)
.enumerate()
.find(|(_, w)| matches!(*w, b"\r\n\r\n"))
.map(|(i, _)| i)
}
使用测试用例永久链接到操场。
推荐阅读
- python - 如何将多个 CSV 文件从目录导出到另一个 CSV 文件表
- c# - C# 查找两个通用列表之间的变化
- gis - Netlogo GIS坐标变换问题
- php - 当我有一些 GET 参数时,如何在自定义页面上更改 woocommerce 产品价格?
- python - Python Paramiko 目录遍历 SFTP
- xml - 如何减少 SVG 的图像 id/xlink 数据?
- kubernetes - 舵图错误无法评估类型接口 {} 中的字段值
- kotlin - kotlin,从里面返回的地方放手
- wordpress - 无法通过 HTTPS 访问 WordPress docker 容器的静态文件
- javascript - Highcharts 的导航器和依赖箭头 (ganttChart)