gpt4 book ai didi

戈朗 : Read buffered input as signed 16bit ints

转载 作者:IT王子 更新时间:2023-10-29 00:42:22 26 4
gpt4 key购买 nike

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

  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)
    }
    }
    }

最佳答案

当使用 IO 时,你总是使用 []byte,没有办法用 []int16 代替它,或者预先格式化为 >int16s,它始终是一个字节流。

你可以看看encoding/binary解码此流的包。

// to get the first uint16 as i
i := binary.LittleEndian.Uint16(buf[:2])

然后您可以根据需要遍历 buf。

您还可以使用 binary.Read直接从 io.Reader 读取。

var i uint16
for {
err := binary.Read(r, binary.LittleEndian, &i)
if err != nil {
log.Println(err)
break
}
fmt.Println(i)
}

值得注意的是需要完成的工作的简单性。每个 uint16 都是通过以下方式创建的:

func (littleEndian) Uint16(b []byte) uint16 {
return uint16(b[0]) | uint16(b[1])<<8
}

关于戈朗 : Read buffered input as signed 16bit ints,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28949063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com