如何将切片分成头部数组引用和尾部切片?

huangapple go评论78阅读模式
英文:

How to split a slice into a header array reference and a tail slice?

问题

我正在寻找一个签名类似于:

split_header_and_tail(buf: &[u8]) -> Option<(&[u8; HEADER_LENGTH], &[u8])>

如果提供的切片太短,结果是 None,但如果足够长,将返回对前 HEADER_LENGTH 字节和尾部切片的引用。

第一部分必须是对固定长度数组的引用,因为我需要将其分成各种固定长度的字段。

英文:

I'm looking for a function with a signature similar to:

split_header_and_tail(buf: &amp;[u8]) -&gt; Option&lt;(&amp;[u8; HEADER_LENGTH], &amp;[u8])&gt;

If the supplied slice is too short, the result is None, but if it's long enough a reference to the first HEADER_LENGTH bytes and the tail slice are returned.

The first part must be a reference to a fixed-length array, as I need to subdivide it into various fixed-length fields.

答案1

得分: 2

在夜间版中,有 split_array_ref()

#![feature(split_array)]

fn split_header_and_tail(buf: &[u8]) -> Option<(&[u8; HEADER_LENGTH], &[u8])> {
    if buf.len() < HEADER_LENGTH {
        None
    } else {
        Some(buf.split_array_ref())
    }
}

在稳定版中,您可以使用 TryInto

fn split_header_and_tail(buf: &[u8]) -> Option<(&[u8; HEADER_LENGTH], &[u8])> {
    if buf.len() < HEADER_LENGTH {
        None
    } else {
        let (head, tail) = buf.split_at(HEADER_LENGTH);
        Some((head.try_into().unwrap(), tail))
    }
}
英文:

On nightly, there is split_array_ref():

#![feature(split_array)]

fn split_header_and_tail(buf: &amp;[u8]) -&gt; Option&lt;(&amp;[u8; HEADER_LENGTH], &amp;[u8])&gt; {
    if buf.len() &lt; HEADER_LENGTH {
        None
    } else {
        Some(buf.split_array_ref())
    }
}

On stable, you can use TryInto:

fn split_header_and_tail(buf: &amp;[u8]) -&gt; Option&lt;(&amp;[u8; HEADER_LENGTH], &amp;[u8])&gt; {
    if buf.len() &lt; HEADER_LENGTH {
        None
    } else {
        let (head, tail) = buf.split_at(HEADER_LENGTH);
        Some((head.try_into().unwrap(), tail))
    }
}

huangapple
  • 本文由 发表于 2023年7月17日 17:15:52
  • 转载请务必保留本文链接:https://go.coder-hub.com/76703012.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定