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

Ziv*_*iva 5 arrays type-conversion rust

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

let hashvalue = sha2::Sha256::digest(&data);
Run Code Online (Sandbox Code Playgroud)

计算后,我想将此值放入结构的字段中:

let x = Hash { value: hashvalue };
Run Code Online (Sandbox Code Playgroud)

但是,Hash结构需要 value 的类型[u8; 32],而我的hashvalue变量是 type GenericArray<u8, ?>。我怎样才能转换hashvalue成正确的类型?我尝试使用as [u8; 32]arr!但没有用。

She*_*ter 8

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

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);
}
Run Code Online (Sandbox Code Playgroud)

也可以看看:


phi*_*mue 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],
    ];
}
Run Code Online (Sandbox Code Playgroud)