我得到了一个像下面这样工作的二进制文件:
> ./my_bin raw.avi output_file.avi
output_file.avi是我想要的,当作业成功时,终端会打印一些详细信息,例如:
版权所有 2022 Company Inc... 成功。
我想在我的代码中运行这个命令并将其重定向output_file.avi到某个字节数组,这样我就不必从磁盘读取它并删除它。我的方法类似于下面的 Golang 代码片段:
func wrongOne(stdin []byte) ([]byte, error) {
inBuf := bytes.NewBuffer(stdin)
outBuf := bytes.NewBuffer(nil)
cmd := exec.Command("./my_bin", "/dev/stdin", "/dev/stdout")
cmd.Stdin = inBuf
cmd.Stdout = outBuf
err := cmd.Run()
if err != nil {
return nil, err
}
return outBuf.Bytes(), nil // wrong
}
但是,返回的字节数组比下面的方法长,这会导致 MD5 检查失败。
func correctOne(stdin []byte) ([]byte, error) {
inBuf := bytes.NewBuffer(stdin)
cmd := exec.Command("./my_bin", "/dev/stdin", "output_file")
cmd.Stdin = inBuf
err := cmd.Run()
if err != nil {
return nil, err
}
return os.ReadFile("output_file")
}
该wrongOne功能可以修改为以下代码是正确的:
func modifiedWrongOne(stdin []byte) ([]byte, error) {
inBuf := bytes.NewBuffer(stdin)
outBuf := bytes.NewBuffer(nil)
cmd := exec.Command("./my_bin", "/dev/stdin", "/dev/stdout")
cmd.Stdin = inBuf
cmd.Stdout = outBuf
err := cmd.Run()
if err != nil {
return nil, err
}
correct, _ := correctOne(stdin)
return outBuf.Bytes()[:len(correct)], nil // diff
}
我假设输出详细信息包含在 中,/dev/stdout因此该wrongOne函数不起作用。IE,
wrongOne= 的输出+ correctOne[]byte{"Copyright 2022 Company Inc... Success."}
有没有什么解决方案可以output_file.avi在不将其保存为文件并从磁盘读取的情况下获取管道?谢谢!
HUH函数
侃侃无极
相关分类