首页 > 解决方案 > 如何拆分 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 值\r10的值\n。然后我按返回的索引进行拆分。虽然这个解决方案在技术上是可行的,但感觉很不干净,我想知道如何以更优雅的方式做到这一点。

标签: httprust

解决方案


首先:

  1. 函数几乎不应该有&Vec<_>参数。

    请参阅为什么不鼓励接受对 String (&String)、Vec (&Vec) 或 Box (&Box) 的引用作为函数参数?.

  2. 不要使用魔法值 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)
}

使用测试用例永久链接到操场。


推荐阅读