当使用 ReadBytesExt 从字节切片中读取整数时,为什么会收到错误“不满足特征边界”?

Jaw*_*ser 4 arrays casting reference slice rust

以下 Rust 代码无法编译。

extern create byteorder;
use byetorder::{LittleEndian, ReadBytesExt};

fn main() {                                                                          
    let buf: [u8; 12] = [                                                                     
        0x00, 0x42, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x30,               
    ];
    let id = &buf[0..1].read_u16::<LittleEndian>();              }
Run Code Online (Sandbox Code Playgroud)

来自编译器的消息:

extern create byteorder;
use byetorder::{LittleEndian, ReadBytesExt};

fn main() {                                                                          
    let buf: [u8; 12] = [                                                                     
        0x00, 0x42, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x30,               
    ];
    let id = &buf[0..1].read_u16::<LittleEndian>();              }
Run Code Online (Sandbox Code Playgroud)

u16Stack Overflow 上有非常相似的问题,我已经评论过,但我的问题与那些问题略有不同,因为我试图从切片中读取 a 。在实践中,我不确定为什么我的例子有本质上的不同,我确信我错过了一些明显的东西。

具体来说,我不清楚我所得到的与此处接受的答案中的内容有何显着不同:

如何将字节切片 (&[u8]) 的缓冲区转换为整数?

&[u8]我说的时候不也有吗&buf[0..1]

Sve*_*ach 7

您的代码调用read_u16()array不是slice。您可能打算在 on 上调用该方法&buf[0..1],但由于运算符优先级,您实际上是在 on 上调用该方法buf[0..1]。只需添加一对括号即可解决此问题:

let id = (&buf[0..1]).read_u16::<LittleEndian>();
Run Code Online (Sandbox Code Playgroud)

您的原始代码被解释为&(buf[0..1].read_u16::<LittleEndian>()),这就是编译器抱怨该ReadBytesExt特征未针对 实现的原因[u8]