我正在尝试使用字节顺序板条箱提供的特征:
extern crate byteorder;
use byteorder::{LittleEndian, ReadBytesExt};
fn main() {
let mut myArray = [0u8; 4];
myArray = [00000000, 01010101, 00100100, 11011011];
let result = myArray.read_u32::<LittleEndian>();
println!("{}", result);
}
我遇到错误:
error[E0599]: no method named `read_u32` found for type `[u8; 4]` in the current scope
--> src/main.rs:10:26
|
10 | let result = myArray.read_u32::<LittleEndian>();
| ^^^^^^^^
|
= note: the method `read_u32` exists but the following trait bounds were not satisfied:
`[u8; 4] : byteorder::ReadBytesExt`
`[u8] : byteorder::ReadBytesExt`
我已经阅读了有关特质的这本书一章,无法理解为什么这里不满足特质约束。
答案 0 :(得分:1)
[u8]
和[u8; 4]
均未实现ReadBytesExt
。如图in the documentation所示,您可以使用std::io::Cursor
:
let my_array = [0b00000000,0b01010101,0b00100100,0b11011011];
let mut cursor = Cursor::new(my_array);
let result = cursor.read_u32::<LittleEndian>();
println!("{:?}", result);
在这里可以使用实现Read
的任何类型,因为ReadBytesExt
的实现方式如下(source link):
impl<R: io::Read + ?Sized> ReadBytesExt for R {}
由于&[u8]
实现了Read
,因此您可以将其简化为
(&my_array[..]).read_u32::<LittleEndian>();
或者甚至直接使用LittleEndian
特性:
LittleEndian::read_u32(&my_array);
您的代码中还有其他错误:
[00000000,01010101,00100100,11011011]
将自动换行。使用binary literal instead:[0b0000_0000,0b0101_0101,0b0010_0100,0b1101_1011]
_
来使长号更易读snake_case
中。使用my_array
代替myArray
let my_array = [0b0000...
另请参阅: