Golang:将缓冲输入读取为带符号的 16 位整数

can*_*ayr 5 buffer wav go

我正在尝试读取带符号的 16 位整数(wav 格式)的缓冲流,但 bufio.Read 方法只接受一个字节数组。我的问题是一个两部分:

  1. 我可以将字节流预先格式化为缓冲的 int16 数组吗?
  2. 如果我不能,将字节数组后处理为 int16 数组的最佳方法是什么?我最初的想法是使用 tmp 数组并继续推送/处理它们,但我很好奇是否有更惯用的方法来做到这一点?

    package main
    
    import (
         "bufio"
         "io"
         "log"
         "os/exec"
    )
    
    func main() {
    
        app := "someapp"
    
        cmd := exec.Command(app)
        stdout, err := cmd.StdoutPipe()
        r := bufio.NewReader(stdout)
        if err != nil {
            log.Fatal(err)
        }
        if err := cmd.Start(); err != nil {
            log.Fatal(err)
        }
    
        //"someapp" outputs signed 16bit integers (little endian))
        buf := make([]byte, 0, 4*1024)
    
        for {
            n, err := r.Read(buf[:cap(buf)])    //r.Read only accepts type []byte
            buf = buf[:n]
            if n == 0 {
                if err == nil {
                    continue
                }
                if err == io.EOF {
                    break
                }
                log.Fatal(err)
            }
    
            log.Printf("%x\n", buf)
            //process buf here
    
            if err != nil && err != io.EOF {
                log.Fatal(err)
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

mar*_*us1 1

您可以使用直接从阅读器encoding/binary.Read填写 an []int16,尽管从技术上讲,第一个问题的答案仍然是否定的(检查 的来源binary.Read,它首先读取数据[]byte)。