记录,使用Rust解析音频文件的ID3V1标签
//Id3v1 tag
let path="漫 步 人 生 路 .mp3";
//打 开 文 件
let file = File::open(path).expect("文 件 打 开 >
失 败 ");
//获取文件的大小,单位字节
let len = file.metadata().unwrap().len();
//获取TAG标签,长度3
let mut buffer = vec![0;3];
//从文件末尾的第128字节读取3个字节
file.read_at(&mut buffer, len-128).unwrap();
//转 为 字 符 串
let tag = String::from_utf8(buffer).expect(">
转 换 失 败 ");
//打 印
println!("{}\nTAG={}",path,tag);
歌名占空间30字节,从倒数第125个字节开始读,其他的标签同理 在转换的时候遇到了gbk的编码,utf8转换失败。这里使用用了第三方的编解码库进行解码
//歌 名 , 长 度 30
let mut buffer=vec![0;30];
file.read_at(&mut buffer, len-125).unwrap();
let title=to_string(&mut buffer);
println!("title={}",title);
//把byte转字符串的操作包装一下
fn to_string(buffer:&mut Vec<u8>)->String{
//ID3V1的 标 签 是 固 定 长 度 , 多 余 的 会 用 0替 代
//这 个 方 法 把 多 余 的 0去 掉
buffer.retain(|s| *s!=0);
let buffer=buffer.clone();
//先 用 gbk解 码 , 如 果 失 败 就 用 utf8解 码
let c =match GBK.decode(&buffer,DecoderTrap::Stri
ct){
Ok(c)=>c,
Err(_)=>{
//utf8
return String::from_utf8(buffer).unwrap()
;
},
};
c
}
用到的第三方库
use encoding::{Encoding, DecoderTrap};
use encoding::all::GBK;
Toml文件
[dependencies]
encoding = "0.2"