如何将 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);
我对 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);