在我的终端命令中adb shell screencap -p | sed 's/\r$//' > screen.png
它正常工作,保存我的安卓屏幕。
我知道可以使用adb pull
,但我想知道如何使用stdout方式在Rust中保存图像?所以,我尝试这个代码,买不能打开图像。编码可能存在问题,但我不知道如何修复它们
let output = Command::new("adb")
.arg("shell")
.arg("screencap -p")
.output()
.expect("failed to execute process");
let byte_string = String::from_utf8_lossy(&output.stdout).replace("\r\n","\n");
let byte_string = String::from_utf8_lossy(&output.stdout);
let mut buffer = File::create("foo.png")?;
buffer.write(&byte_string.as_bytes())?;
答案 0 :(得分:1)
图像数据是二进制的,而不是Unicode字符串。因此,您需要打印&[u8]
而不是UTF-8 String
。
let out = std::io::stdout();
out.write_all(slice)?;
out.flush()?;
flush
是必要的,因为紧随程序退出的write_all
无法将字节传递给基础文件描述符。
由于rust对u8数组没有字符串处理,你需要手动撤消adb mangling,方法是遍历字节并检查当前的字节是否为\ r而下一个是\ n然后跳过当前的字符串。