我想将字符串(SHA256哈希)转换为Rust中的十六进制:

extern crate crypto;
extern crate rustc_serialize;

use rustc_serialize::hex::ToHex;
use crypto::digest::Digest;
use crypto::sha2::Sha256;

fn gen_sha256(hashme: &str) -> String {
    let mut sh = Sha256::new();
    sh.input_str(hashme);

    sh.result_str()
}

fn main() {
    let hash = gen_sha256("example");

    hash.to_hex()
}

编者说:

error[E0599]: no method named `to_hex` found for type `std::string::String` in the current scope
  --> src/main.rs:18:10
   |
18 |     hash.to_hex()
   |          ^^^^^^

我能看出这是真的;看起来是it's only implemented for [u8].

我该怎么办?在Rust中是否没有实现将字符串转换为十六进制的方法?

我的Cargo .toml依赖项:

[dependencies]
rust-crypto = "0.2.36"
rustc-serialize = "0.3.24"

edit我刚从rust crypto库中意识到字符串是already的十六进制格式.哦.

推荐答案

我将在这里讨论一个问题,并建议解决方案是hashVec<u8>型.


问题是,虽然确实可以使用as_bytesString转换为&[u8],然后使用to_hex,但首先需要有一个有效的String对象.

虽然任何String个对象都可以转换为&[u8],但事实并非如此.String对象仅用于保存有效的UTF-8编码的Unicode字符串:并非所有字节都符合模式.

因此,gen_sha256产生String是不正确的.更正确的类型是Vec<u8>,它确实可以接受任何字节模式.从那时起,调用to_hex就很容易了:

hash.as_slice().to_hex()

Rust相关问答推荐

Tauri tauri—apps/plugin—store + zustand

当为a Self:IntoIterator设置trait bind `时,获取`a T `不是迭代器"&'"<'>&'

下载压缩文件

如何在Bevy/Rapier3D中获得碰撞机的计算质量?

在Rust中,在实现特征`Display`时,如何获取调用方指定的格式?

为什么';t std::cell::ref使用引用而不是非空?

在Rust中判断编译时是否无法访问

异步函数返回的future 生存期

Rust ndarray:如何从索引中 Select 数组的行

为什么我可以使用 &mut (**ref) 创建两个实时 &mut 到同一个变量?

Rust 如何将链表推到前面?

Rust中是否可以在不复制的情况下从另一个不可变向量创建不可变向量?

在1.5n次比较中找到整数向量中的最大和次大整数

从Rust 的临时文件中创建引用是什么意思?

使用部分键从 Hashmap 中检索值

如何解析 Rust 中的 yaml 条件字段?

如何在 Rust 中编写涉及异步的重试函数

使用 rust-sqlx/tokio 时如何取消长时间运行的查询

在特征中返回一个 Self 类型的值

这个 match 语句的默认值应该是什么,还有一种方法可以解开 Some case (chess in rust)