如何将GenericArray<T, ?>转换为相同长度的数组?

12

我正在计算给定数据的SHA256:

let hashvalue = sha2::Sha256::digest(&data);

在计算完成后,我想将此值放入我的结构体中的一个字段:
let x = Hash { value: hashvalue };

然而,Hash结构体期望值的类型为[u8; 32],而我的hashvalue变量的类型是GenericArray<u8, ?>。我该如何将hashvalue转换为正确的类型?我尝试使用as [u8; 32]arr!,但都没有成功。


1
很难回答你的问题,因为它没有包含一个 [MRE]。我们无法确定代码中存在哪些 crates(及其版本)、types、traits、fields等。如果可能的话,您可以在Rust Playground上尝试重现错误,否则可以在全新的Cargo项目中进行,然后[编辑]您的问题以包括额外的信息。这里有一些Rust特定的MRE提示,您可以使用它们来缩小您的原始代码以便在此处发布。谢谢! - Shepmaster
2个回答

14

如果您不知道数组的长度,将 GenericArray 转换为切片,然后将切片转换为数组(仅适用于长度小于32的数组,在 Rust 1.47 之前):

use sha2::Digest; // 0.9.3
use std::convert::TryInto;

fn main() {
    let hashvalue = sha2::Sha256::digest(&[3, 2, 6, 4, 3]);
    let x: [u8; 32] = hashvalue.as_slice().try_into().expect("Wrong length");
    println!("{:?}", x);
}

另请参见:


0
根据 GenericArray文档,我认为你可以使用hashvalue.into(),但是我没能成功编译。
非惯用语句:
use digest::Digest; // 0.7.6
use generic_array; // 0.13.2
use sha2; // 0.7.1

fn main() {
    let hashvalue = sha2::Sha256::digest(&[3, 2, 6, 4, 3]);
    let x: [u8; 32] = [
        hashvalue[0],
        hashvalue[1],
        hashvalue[2],
        hashvalue[3],
        hashvalue[4],
        hashvalue[5],
        hashvalue[6],
        hashvalue[7],
        hashvalue[8],
        hashvalue[9],
        hashvalue[10],
        hashvalue[11],
        hashvalue[12],
        hashvalue[13],
        hashvalue[14],
        hashvalue[15],
        hashvalue[16],
        hashvalue[17],
        hashvalue[18],
        hashvalue[19],
        hashvalue[20],
        hashvalue[21],
        hashvalue[22],
        hashvalue[23],
        hashvalue[24],
        hashvalue[25],
        hashvalue[26],
        hashvalue[27],
        hashvalue[28],
        hashvalue[29],
        hashvalue[30],
        hashvalue[31],
    ];
}

1
这是因为sha2 0.8使用了digest 0.8,而digest 0.8又使用了generic-array 0.12.0,该版本并未实现Into接口——只有0.13版本才有。这很可能是人们在Cargo.toml中没有指定最兼容的crate版本,而是总是选择最新的版本(即使他们可以支持多个版本)的另一个案例。 - Shepmaster
1
另外,我为您的导入添加了版本,假设您正在使用游乐场。但是,请注意,游乐场并没有所有这些板条箱的最新版本。如果您没有使用游乐场,请修复我的更正,以使它们准确无误。 - Shepmaster

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