代码之家  ›  专栏  ›  技术社区  ›  user2138149

如何检查std::vector<uint8_t>的前三个字节是“G”、“E”还是“t”?

  •  1
  • user2138149  · 技术社区  · 7 月前

    我想检查一下 std::vector<uint8_t> recv_buffer 以字符串“GET”开头。

    最简单的方法是单独检查前3个字节中的每一个。然而,这并不能产生非常可读的代码。

    我试图创建一个 std::string_view 从a std::vector 但无法弄清楚如何在不涉及指针强制转换的复杂语句的情况下做到这一点。

    我的目的是比较 string_view 反对 "GET" .

    我想我可能可以制作一个3字节/字符长的 字符串视图 引用向量前3个字节的对象。但似乎没有办法做到这一点。

    也许a span 对象可以用作中介还是什么?但它看起来不像 字符串视图 可以由一个 跨度;跨越;持续时间;(桥或拱的)墩距;跨距; 包括(广大地区) 容易。

    我试过了

    if(recv_buffer.size() >= 3) {
        std::string_view view(static_cast<const char* const>(&(*recv_buffer.cbegin())), 3);
        if(view == "GET") {
            // something
        }
    }
    

    但这会产生 invalid static_cast 错误。 reinterpret_cast 会奏效,但我不确定做一堆黑客指针转换是不是一个好的解决方案。

    2 回复  |  直到 7 月前
        1
  •  2
  •   Barry    7 月前

    有一个算法: starts_with() :

    if (std::ranges::starts_with(recv_buffer, "GET"sv))
    

    请注意,你必须特别做 "GET"sv ,不 "GET" 后者会编译,但不幸的是做了错事,因为 “得到” 是a char const[4] 这样不仅可以检查前三个字符是否在 recv_buffer 等于 GET 而且第四个是 \0 .


    另一种方法是使用 string_view 在另一边。 字符串视图 可以从任何合适的连续随机接入范围明确地构造:

    if (std::string_view(recv_buffer).starts_with("GET"))
    

    在这里,只是使用 “得到” 很好,因为有 specific overload 对于 char const* .

        2
  •  1
  •   user2138149    7 月前

    另一种方法是使用 std::equal .

    const std::string GET("GET");
    if(recv_buffer.size() >= 3) {
        if(std::equal(GET.cbegin(), GET.cend(), recv_buffer.cbegin())) {
            // something
        }
    }
    

    这不是对这个问题的直接回答,但我认为值得提出另一种解决方案。