英文:
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: &[u8]) -> Option<(&[u8; HEADER_LENGTH], &[u8])>
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: &[u8]) -> Option<(&[u8; HEADER_LENGTH], &[u8])> {
if buf.len() < HEADER_LENGTH {
None
} else {
Some(buf.split_array_ref())
}
}
On stable, you can use 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))
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论