gpt4 book ai didi

http - 如何通过字符序列分割Vec

转载 作者:行者123 更新时间:2023-12-03 11:41:32 26 4
gpt4 key购买 nike

我想将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?
  • 不要使用魔术值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)
    }
    Permalink to the playground与测试用例。

    关于http - 如何通过字符序列分割Vec <u8>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64849149/

    26 4 0