我想将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
是\r
的ASCII值,而10
是\n
的值。然后,我按返回的索引进行拆分。虽然此解决方案在技术上可以正常工作,但感觉却很不干净,我想知道如何以更优雅的方式做到这一点。
最佳答案
首先:
&Vec<_>
参数。参见Why is it discouraged to accept a reference to a String (&String), Vec (&Vec), or Box (&Box) as a function argument?。
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)
}
Permalink to the playground与测试用例。
关于http - 如何通过字符序列分割Vec <u8>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64849149/