如何将Base58编码的数据转换为Vec <u8>然后转换为字符串?

时间:2018-02-26 20:09:17

标签: rust

我正在尝试将String转换为from_uf8以进行显示。我试图使用from_iteruse rust_base58::{ToBase58, FromBase58}; let address = String::from("1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH"); let _hash160 = address.from_base58(); let mut s = String::from_utf8(_hash160).unwrap(); //let s = String::from_iter(_hash160); s.remove(0); s.pop(); s.pop(); s.pop(); s.pop(); println!("{}", s); 但没有运气。

`heroes.result.heroes[0].name` 

2 个答案:

答案 0 :(得分:2)

.from_base58()

返回

Result<Vec<u8>, FromBase58Error>

因为如果数据不是有效的Base 58,转换可能会失败。

假设您要像from_utf8那样忽略错误,您需要.unwrap()来获取您正在寻找的Vec<u8>,例如

let hash160 = address.from_base58().unwrap();
let mut s = String::from_utf8(hash160).unwrap();

其余的应该按照How do I convert a Vector of bytes (u8) to a string中的说明进行编译。

当您准备好代码生产时,请确保在没有.unwrap()的情况下处理错误。

答案 1 :(得分:0)

错误告诉您部分问题。

 --> src/main.rs:7:35
  |
7 |     let mut s = String::from_utf8(_hash160).unwrap();
  |                                   ^^^^^^^^ expected struct `std::vec::Vec`, found enum `std::result::Result`
  |
  = note: expected type `std::vec::Vec<_>`
             found type `std::result::Result<std::vec::Vec<_>, rust_base58::base58::FromBase58Error>`
  = help: here are some functions which might fulfill your needs:
          - .unwrap()
          - .unwrap_or_default()

您尝试将_hash160用作Vec<u8>。但from_base58会返回Result<Vec<u8>, FromBase58Error>。你必须处理Result。完整的程序会有错误处理,但是现在我们可以使用unwrap,如果_hash160是错误的话会出错。

let _hash160 = address.from_base58().unwrap();

_hash160很好,但我们从String::from_utf8(_hash160).unwrap();收到错误。

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: FromUtf8Error { bytes: [0, 117, 30, 118, 232, 25, 145, 150, 212, 84, 148, 28, 69, 209, 179, 163, 35, 241, 67, 59, 214, 81, 13, 22, 52], error: Utf8Error { valid_up_to: 4, error_len: Some(1) } }'

Utf8Error告诉我们第5个字节无效。 hash160中的字节序列不是有效的UTF8字符串。

如果我们尝试String::from_utf8_lossy ...

println!("{}", String::from_utf8_lossy(&_hash160));

......我们得到了一堆废话。

4v����T�Eѳ�#�C;�Q

它也不是有效的ASCII string,232太高了。我们可以使用std::ascii::AsciiExt::is_ascii明确检查此内容。

use std::ascii::AsciiExt;

...

# false
println!("{}", _hash160.is_ascii());

您可能只需要将其视为一个字节序列。您可以在调试模式下打印它。

println!("{:?}", _hash160);

给出了:

[0, 117, 30, 118, 232, 25, 145, 150, 212, 84, 148, 28, 69, 209, 179, 163, 35, 241, 67, 59, 214, 81, 13, 22, 52]