Rust:如何将字节连接在一起

Ant*_*REL 6 rust

我已经阅读了以下链接,但当前的尝试仍然出现一些错误:

let data = &[37u8, 42u8];
let data_two = &[0x34u8, 0x32u8];
let res:Vec<u8> = [data, data_two].concat();
Run Code Online (Sandbox Code Playgroud)

另外,理想情况下我想避免串联,并将 u8 数组写入缓冲区,其中我保留前两个字节用于存储长度和索引,例如:

let nb:u8 = get_chunks_nb();
let index:u8 = get_chunk_index();
let header = &[nb, index];

// this kind of things in C:
memcpy(&buffer, header, 2);
memcpy(&buffer[2], chunk, chunk_len);
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助!

Sha*_*tia 6

我尝试了一下,但我不能 100% 确定为什么,我对 Rust 还很陌生。

看起来编译器将data和视为data_two数组,因此[data, data_two]是数组的数组而不是切片的数组。这可能就是为什么它找不到concat它的方法的原因。

通过明确地说数据是一个切片,一切似乎都已就位:

let data:&[u8] = &[37u8, 42u8];
let data_two = &[0x34u8, 0x32u8];
let mut res:Vec<u8> = [data, data_two].concat();
Run Code Online (Sandbox Code Playgroud)

  • `[data, data_two]` 是一个引用数组,但 `[*data, *data_two]` 是一个数组的数组,因此在您实际调用`之前,必须将数组中的内容复制到更大的数组中.concat()` ,这将*再次*复制内容。因此,这可能会导致一份和两份之间的差异。在这种微不足道的情况下,编译器优化很可能使差异变得无关紧要。 (2认同)
  • @AntoninGAVREL我可能会使用`[data as &amp;[_], data_two].concat()`(强制引用不需要复制内容)或者我猜`[data.as_ref(), data_two]`也可以。 (2认同)