如何使用GenericArray?

8
在下面的 Rust 代码中,我无法将字节数组转换为 GenericArray。编译器让我像这样给 “bytes” 指定一个类型 generic_array::GenericArray<u8, N>,但是我不知道要使用什么作为 “N”。
我发现 N 必须是 ArrayLength 类型,但是我卡在这里,因为我不知道要传递什么大小的链接。
fn main() {

    use aes::block_cipher_trait::generic_array::GenericArray;

    let phrase = "Le Rust tu comprendras jeune padawan !";

    println!("my phrase {:?}", &phrase);

    let b = phrase.as_bytes();

    println!("my bytes {:?} len : {}", &b, b.len());

    let bytes = GenericArray::clone_from_slice(&b[0..16]);

    println!("my bytes {:?}", &bytes);
}
1个回答

10

aes::cipher::generic_array只是crate generic_array的一个副本,所以值得阅读那里的文档。

GenericArray<T, N>中的第二个类型参数在某种意义上表示了GenericArray的长度。generic_array默认使用了crate typenum中的类型(尽管通过一些努力,你可以提供自己的类型——你只需要为它们实现必要的特性)。

就像提供generic_array作为公共依赖一样,generic_array在其树中也有一个typenum的副本,所以你可以像这样使用它的类型:

fn main() {
    use aes::cipher::generic_array::{typenum::U16, GenericArray};

    let phrase = "Le Rust tu comprendras jeune padawan !";

    println!("my phrase {:?}", &phrase);

    let b = phrase.as_bytes();

    println!("my bytes {:?} len : {}", &b, b.len());

    let bytes: GenericArray<_, U16> = GenericArray::clone_from_slice(&b[0..16]);

    println!("my bytes {:?}", &bytes);
}

(playground. 注意我直接使用了generic_array。这个playground没有aes crate。)

在这里,我们使用了typenum::U16,因为我们想要一个长度为16的数组。


非常感谢您提供的简洁明了的答案! - the duck
这只是展示如何使用clone_from_slice的示例。我不认为这就是为什么这个问题很受欢迎的原因。人们想知道如何从一个数组[u8;32]转换为GenericArray等等。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接