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

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

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

问题

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

  1. 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:

  1. 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()

  1. #![feature(split_array)]
  2. fn split_header_and_tail(buf: &[u8]) -> Option<(&[u8; HEADER_LENGTH], &[u8])> {
  3. if buf.len() < HEADER_LENGTH {
  4. None
  5. } else {
  6. Some(buf.split_array_ref())
  7. }
  8. }

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

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

On nightly, there is split_array_ref():

  1. #![feature(split_array)]
  2. fn split_header_and_tail(buf: &amp;[u8]) -&gt; Option&lt;(&amp;[u8; HEADER_LENGTH], &amp;[u8])&gt; {
  3. if buf.len() &lt; HEADER_LENGTH {
  4. None
  5. } else {
  6. Some(buf.split_array_ref())
  7. }
  8. }

On stable, you can use TryInto:

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

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:

确定