int16切片如何优雅转成byte切片?

1. 场景

pcm流式数据转opus文件。使用到了 github.com/hraban/opus 第三方库。其中 Encode需要pcm为[]int16格式。

2. 问题描述?

[]int16如何优雅转成[]byte?
现在[]byte可以转成[]int16
下面是示例代码

3. 代码

func main() {

    // int16转byte
    nums := [6]int16{2, 3, 5, 7, 11, 13}
    buf := new(bytes.Buffer)
    err := binary.Write(buf, binary.LittleEndian, nums)
    if err != nil {
        fmt.Printf("Write%v", err)
    }

    // byte转int16 (有问题 无法实现效果)
    bs := make([]int16, 0)
    err = binary.Read(bytes.NewReader(buf.Bytes()), binary.LittleEndian, bs)
    if err == nil {
        fmt.Printf("%x", bs) // 现在输出 []
    } else {
        fmt.Printf("Read%x", err)
    }
}

请赐教

4. 您实际得到的结果?

[2 3 5 7 11 13]

5. 其他问题

有没有使用过这个库的啊,求推荐其他opus转换的第三方库

最佳答案

你的bs在创建的时候,指明的size是0, 空数组,必然无法写入数据啊。

package main

import (
    "bytes"
    "encoding/binary"
    "fmt"
)

func main() {
    // int16转byte
    nums := [6]int16{2, 3, 5, 7, 11, 13}
    buf := new(bytes.Buffer)
    err := binary.Write(buf, binary.LittleEndian, nums)
    if err != nil {
        fmt.Printf("Write%v", err)
    }

    // byte转int16 (有问题 无法实现效果)
    bs := make([]int16, len(nums))
    err = binary.Read(bytes.NewReader(buf.Bytes()), binary.LittleEndian, bs)
    if err == nil {
        fmt.Printf("%v\n", bs) // [2 3 5 7 11 13]
    } else {
        fmt.Printf("Read%x", err)
    }
}
1年前 评论
讨论数量: 2

你说的这个库没用过,但是我发现你代码有点问题

bs := make([]int16, 0)
err = binary.Read(bytes.NewReader(buf.Bytes()), binary.LittleEndian, bs)

bs作为一个切片,作为参数传递给函数,函数内部是没法扩容的,bs的长度又是0。所以不管这个函数有没有问题bs始终都会是空的。 可以考虑给bs一个合适的长度试试看。

1年前 评论

你的bs在创建的时候,指明的size是0, 空数组,必然无法写入数据啊。

package main

import (
    "bytes"
    "encoding/binary"
    "fmt"
)

func main() {
    // int16转byte
    nums := [6]int16{2, 3, 5, 7, 11, 13}
    buf := new(bytes.Buffer)
    err := binary.Write(buf, binary.LittleEndian, nums)
    if err != nil {
        fmt.Printf("Write%v", err)
    }

    // byte转int16 (有问题 无法实现效果)
    bs := make([]int16, len(nums))
    err = binary.Read(bytes.NewReader(buf.Bytes()), binary.LittleEndian, bs)
    if err == nil {
        fmt.Printf("%v\n", bs) // [2 3 5 7 11 13]
    } else {
        fmt.Printf("Read%x", err)
    }
}
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!