如何将 Result<Refmut<&[u8]>> 转换为可读字符串

how to convert Result<Refmut<&[u8]>> to readable string

我对 rust 和 solana 很陌生,我想将 public 关键数据解压为字符串。 我在谷歌上搜索了几个小时,并尝试了一些解决方案,比如转换为 base64,这不是很好,因为它不可读。 令牌切片在展开后是 RefMut<&mut [u8]>

这是我的代码,尝试使用 from_utf8 函数,但出现错误(如下所列)

use solana_program::{
    account_info::{next_account_info, AccountInfo},
    entrypoint,
    entrypoint::ProgramResult,
    msg,
    program_error::ProgramError,
    pubkey::Pubkey,
};
entrypoint!(process_handler);

fn process_handler(
    _program_id: &Pubkey,
    account_info: &[AccountInfo],
    _instruction_data: &[u8],
) -> ProgramResult {
    let accounts = &mut account_info.iter();
    let token_address = next_account_info(accounts)?;
    let user_address = next_account_info(accounts)?;
    let token_slice = token_address.try_borrow_mut_data().unwrap();
    msg!("token slice is {:?}", std::str::from_utf8(&token_slice));
    if !user_address.is_signer {
        msg!("Signer Error test");
        return Err(ProgramError::IllegalOwner);
    }
    msg!("this is user public key {}", user_address.key.to_string());
    return Err(ProgramError::IllegalOwner);
}

错误:

我已经搜索了几个小时并且非常绝望,即使有人可以给我一个线索,那也会有所帮助。

编辑: 我附上 token_slice 数据的图片

在 Solana 中,Pubkey 只是 32 个字节的数据,典型的“字符串”表示是对这 32 个字节的数据进行 base-58 编码。要解决这个问题,您可以这样做:

let pubkey = Pubkey::new(&token_address.data.borrow()[..32]);
msg!("token slice is {}", pubkey);