首页
统计
留言板
关于
Search
1
Rust 包装 objc Block
86 阅读
2
02. Rust 内存管理 Copy & Clone(上)
85 阅读
3
Flutter 调用 Rust 生成的 共享/静态 库
79 阅读
4
纯 C 写个 iOS App(误)
67 阅读
5
用 Rust 开发 iOS 应用(粗糙版)
64 阅读
默认分类
Rust
Apple
iOS
Swift
Android
emulator
NES
登录
/
注册
Search
标签搜索
Rust
iOS
NES
Swift
Android
杂项
limit
累计撰写
18
篇文章
累计收到
0
条评论
首页
栏目
默认分类
Rust
Apple
iOS
Swift
Android
emulator
NES
页面
统计
留言板
关于
搜索到
2
篇与
的结果
2023-04-11
用 Rust 写个 CLI 解决 UWP Bilibili 下载的视频无法播放问题
发现问题众所周知,使用 wINDOWS 微软商店下载的 Bilibili 客户端是有视频下载功能的,不过它有个问题,下载后的视频无法直接使用一般的打开。 稍微研究(使用搜索引擎)一下发觉,原来是该客户端下载后的文件开头补了三个 0xFF。解决方案最简单的方法就是直接使用一些支持 hex 编辑的 editor 手动把它们删掉再保存,不过如果有多个文件(很明显这是常态),那一个一个手动处理太机械了,于是直接写个命令行工具解决。实现原理也很简单,就是直接跳过读取开头三个 0xFF 再写入到新文件。开始编码创建项目创建 Rust 项目先,直接执行 cargo new xxx 就把项目生成好啦。然后添加几个第三方库,首先自然是 clap,然后是错误处理,这种小工具就不手写自定义错误处理啦,使用 anyhow,还可以加个进度条指示器indictif,因为要批处理文件,文件夹内可能有非视频文件,所以加个 regex 包用正则过滤一下文件。其中 clap 用得是它的派生宏版本。cargo add clap -F derive cargo add anyhow cargo add indicatif cargo add regex可以 cat 查看一下 Cargo.toml 内容$ cat ./Cargo.toml --------------------------- [package] name = "xxx" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] anyhow = "1.0.70" clap = { version = "4.2.1", features = ["derive"] } indicatif = "0.17.3" regex = "1.7.3"正式编码先定义好传参,其实就是接收输入的目录,所以用派生宏包一下结构体 Args#[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] struct Args { #[clap(value_parser)] input: String, }然后在 main 函数写上下面的代码,主要是获取待处理的目录,当它不是一个文件夹时直接 panicfn main() { let args: Args = Args::parse(); let p = Path::new(&args.input); if !p.is_dir() { panic!("The input is not directory!"); } read_file(p); }我们还得把 read_file 函数补上,这一步就是基本逻辑就是使用 std::fs::read_dir 读取文件夹内的子路径,判断一下读取到的是否是文件或文件夹,如果是文件夹就递归继续读取,直到读到文件为止,读取到文件就用 process_file 处理它,出错了不管直接 unwrap 死就死吧,小项目是这样的捏。fn read_file(dir: &Path) { for sub_path in read_dir(dir).expect("Failed to read file path.").flatten() { let p = sub_path.path(); if p.is_file() { process_file(&p).unwrap(); } else { read_file(&p); } } }个么很自然地就是实现 process_file 函数,先取到文件名(其实是取得完整的文件路径),然后通过正则过滤一下副档名是 mp4 的文件,读取文件大小给进度条结构用,判断下原文件开头三个字节是 0xFF 下继续进行下一步操作,主要是为了防止处理错文件。然后创建个空文件,循环读取原文件内容写入到新文件,后面再把原文件删除,把新文件修改一下名字,至此处理完成。const BUFFER_SIZE: usize = 1024; fn process_file(p: &Path) -> Result<(), anyhow::Error> { let filename = p .file_name() .expect("Failed to get filename.") .to_str() .expect("Failed to unwrap path str."); let mut buffer = [0u8; BUFFER_SIZE]; let file_regex = Regex::new(r"\.mp4$").expect("Failed to new file regex."); if file_regex.is_match(filename) { let mut original_file = File::open(p)?; let file_size = original_file.metadata()?.len(); let pb = ProgressBar::new(file_size); let mut count = original_file.read(&mut buffer)?; if buffer[0] == 0xFF && buffer[1] == 0xFF && buffer[2] == 0xFF { let new_filename = String::from("new_") + filename; let new_filename = p.with_file_name(new_filename); let new_file_path = Path::new(&new_filename); let mut new_file = File::create(new_file_path)?; let mut is_first = true; while count != 0 { if is_first { new_file.write_all(&buffer[3..count])?; pb.inc((count - 3) as u64); is_first = false; } else { new_file.write_all(&buffer[..count])?; pb.inc(count as u64); } count = original_file.read(&mut buffer)?; } remove_file(p)?; rename(new_file_path, p)?; pb.finish_with_message("done"); } } Ok(()) }然后就可以通过一般的视频播放器打开文件啦。
2023年04月11日
12 阅读
0 评论
0 点赞
2022-10-16
GitHub SSH 设置
记录一下在 Mac 上设置 GitHub 的 SSH keys。设置 Git 用户先在终端执行一下 git config --global --list,看看当前设备的 git 有没有设置好相关的用户名跟邮箱。 有的话就会正常显示user.name=Your Name user.email=your-name@example.com如果没有的话,就会出现类似这种错误fatal: unable to read config file '~/.gitconfig': No such file or directory既然没有那就设置一下git config --global user.name "Your Name" git config --global user.email "Your Email"设置完成后要想确认一下,就重新执行git config --global --list生成 SSH Key这个就比较容易,直接执行这条命令,主要是设置一下邮箱地址ssh-keygen -t rsa -C "your-email-address"一路回车就行,一般会显示下面这些内容,具体内容以自己的系统为准Generating public/private rsa key pair. Enter file in which to save the key (~/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in ~/.ssh/id_rsa. Your public key has been saved in ~/.ssh/id_rsa.pub. The key fingerprint is: SHA256:IuTZyVphdJVuRBBYBjCYtCTD1rJcgumXe0oXdErnUeo limitliu@qq.com The key's randomart image is: +---[RSA 2048]----+ |=o+oo.o+B*o. | |oOo+ =.*. o | |+ * = B..o | | + = B.+ o | | . = BES. | | o * . | | . = | | . | | | +----[SHA256]-----+生成后把内容拷贝到自己的剪贴板,public key 文件生成在哪可以看上面执行后的结果,里面有对应文件路径,我这里生成得文件是在 ~/.ssh/id_rsa.pub 这个路径,Mac 可以直接这样执行这条命令来复制cat ~/.ssh/id_rsa.pub | pbcopy其实就是通过管道符把 cat 到的内容传给 pbcopy,也就是传给 Mac 的剪贴板。在 GitHub 上设置这一步就是正常的打开 GitHub 网站,登录自己需要配置的那个账号,点击头像有个 Settings,然后再点击 SSH and GPG keys(不想手动找就直接点这个链接跳转),我这里只设置 SSH keys。点击 New SSH key然后就会打开下面这些东西,照着图片做就行
2022年10月16日
42 阅读
0 评论
0 点赞