【发布时间】:2022-11-08 15:12:50
【问题描述】:
我得到了一个像下面这样工作的二进制文件:
> ./my_bin raw.avi output_file.avi
output_file.avi 是我想要的,作业成功后会在终端打印一些详细信息,例如:
版权所有 2022 Company Inc... 成功。
我想在我的代码中运行这个命令并将
output_file.avi重定向到某个字节数组中,这样我就不必从磁盘读取它并删除它。我的方法看起来像下面的 Golang sn-p: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而无需将其保存为文件并从磁盘读取?谢谢!
【问题讨论】:
-
快速破解是:
output = bytes.TrimSuffix(output, []byte{"Copyright 2022 Company Inc... Sucess"})(可能在某处带有"\n") -
@LeGEC 遗憾的是,详细信息将包含与输入相关的某些信息,使用静态字符串进行修剪将不起作用,因为它会不时更改:(