rs_toolsbox/src/serialize/mod.rs

57 lines
2.1 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

use base64::Engine;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum HexSerializeError {
#[error("Invalid hex char: {0}")]
InvalidHexChar(#[from] hex::FromHexError),
}
#[derive(Debug, Error)]
pub enum Base64SerializeError {
#[error("Cannot encode Base64 slice: {0}")]
EncodeFailed(#[from] base64::EncodeSliceError),
#[error("Cannot decode Base64 string: {0}")]
DecodeFailed(#[from] base64::DecodeError),
}
/// 将指定可以转换为字节数组的内容以十六进制字符串的形式输出。
pub fn to_hex<T: AsRef<[u8]>>(input: T) -> String {
hex::encode(input)
}
/// 将十六进制字符串转换为字节数组,如果字符串中存在非十六进制字符,则返回错误。
pub fn from_hex(input: &str) -> Result<Vec<u8>, HexSerializeError> {
hex::decode(input).map_err(|e| e.into())
}
/// 将给定的可以转换为字节数组的内容以Base64编码的字符串形式输出。
pub fn to_base64_str<T: AsRef<[u8]>>(input: T) -> String {
base64::prelude::BASE64_STANDARD.encode(input)
}
/// 将给定的可以转换为字节数组的内容以Base64编码的字节数组形式输出。
pub fn to_base64_vec<T: AsRef<[u8]>>(input: T) -> Result<Vec<u8>, Base64SerializeError> {
let mut buf = Vec::new();
base64::prelude::BASE64_STANDARD
.encode_slice(input.as_ref(), &mut buf)
.map_err(|e| Base64SerializeError::EncodeFailed(e))?;
Ok(buf)
}
/// 将给定的Base64编码的字符串转换为字节数组如果字符串中存在不能被识别的内容则返回错误。
pub fn from_base64_str(input: &str) -> Result<Vec<u8>, Base64SerializeError> {
base64::prelude::BASE64_STANDARD
.decode(input)
.map_err(|e| e.into())
}
/// 将给定的Base64编码的字节数组转换为原始字节数组如果字节数组中存在不能被识别转换的内容则返回错误。
pub fn from_base64_vec<T: AsRef<[u8]>>(input: T) -> Result<Vec<u8>, Base64SerializeError> {
let mut buf = Vec::new();
base64::prelude::BASE64_STANDARD
.decode_vec(input.as_ref(), &mut buf)
.map_err(|e| Base64SerializeError::DecodeFailed(e))?;
Ok(buf)
}