如何使用Rust对基底中帐户id的十六进制字符串表示进行编码?
给定一个十六进制表示:如何使用Rust对基底中帐户id的十六进制字符串表示进行编码?,rust,substrate,polkadot,polkadot-js,Rust,Substrate,Polkadot,Polkadot Js,给定一个十六进制表示:0xD43593C715FDD31C61141ABD04A99FD6822C85584CCDE39A5684E7A56DA27D,我们可以使用JavaScript获取它表示的AccountId。然而,锈的相应功能是什么 AccountId是用户地址的地址。例如,5grwvaef5zxb26fz9rcqpdws57cterhpnehxcpnohgkutqy是Alice的帐户id,来自基板的开发链。在rust中,您不应该真正从十六进制表示开始,您想要使用字节 但假设您有十六进制
0xD43593C715FDD31C61141ABD04A99FD6822C85584CCDE39A5684E7A56DA27D
,我们可以使用JavaScript获取它表示的AccountId。然而,锈的相应功能是什么
AccountId是用户地址的地址。例如,
5grwvaef5zxb26fz9rcqpdws57cterhpnehxcpnohgkutqy
是Alice的帐户id,来自基板的开发链。在rust中,您不应该真正从十六进制表示开始,您想要使用字节
但假设您有十六进制,您可以使用hex\u literal::hex
宏将十六进制字符串转换为AccountId字节:
let account: AccountId32 = hex_literal::hex!["d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"].into(),
请注意,0x
从十六进制文字中省略
现在,您应该将[u8;32]
包装在AccountId32
identity结构中
从这里,您可以简单地执行与Display
的AccountId32
实现相同的逻辑:
#[cfg(feature = "std")]
impl std::fmt::Display for AccountId32 {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.to_ss58check())
}
}
基本上,地址是帐户Id字节的ss58
编码版本
ss58编解码器库可以在这里找到:无论如何,看看@Stargateur,我使用了基板世界中已知的关键字,因此没有必要对此进行详细说明。无论如何,我已经添加了相关的超链接。现在清楚了吗?@Stargateur你建议的
hex
行不通,错误是“奇数长度”。该十六进制值是按比例编码的。我需要用那种方式解码它。你能帮我吗?另外,如果问题现在清楚了,你能删除下一票吗?这样它就可以接触到更多的观众?十六进制地址没有任何特殊的编码来阻止它变成字节。奇数长度错误可能与将0x
保留在前面,或忘记复制字符串中的所有字符有关。“我使用了基板世界中已知的关键字,因此没有必要对此进行详细说明。”并非每个人都知道基板事实上,我希望很少有人知道它,而知道生锈的人数要高得多。如果你明确描述你想要/需要什么,你将提高质量和获得好答案的机会,那么只知道生锈的人可以做出好答案。因为举例来说,我不会为了回答你而阅读所有的子状态文档。你的问题仍然不干净,因为我们仍然不知道你的十六进制值是如何工作的。你的例子来自现在这里我不能直接使用显示作为account
是AccountId32
类型,它已经实现了Display
?是的,你可以直接执行println!(“{}”,account)
我想