【问题标题】:Go - int16 slice to byte sliceGo - int16 切片到字节切片
【发布时间】:2020-05-14 00:23:04
【问题描述】:

我正在编写一个与 libalsa 交互的 Go 程序。我将 PCM 数据存储在 []int16 切片中,但要调用 libalsa,我需要将其存储在 []byte 切片中。

如何将 []int16 切片转换为 []byte 以完成此操作?

【问题讨论】:

  • 请注意,将 int16 数据转换为字节需要您选择某种字节顺序,因为您必须将每个 16 位值分解为两个 8 位值。 wiki.multimedia.cx/index.php/PCM#Byte_Order 表明 little-endian 是最常见的顺序。我不知道你使用的例程是否需要这个顺序。
  • 我还要补充一点,如果您正在与 C 代码交互,您可能不想复制字节而是执行类型转换(通过包 unsafe)。这是因为 libalsa'a 代码可能期望 *char 仅仅是因为这是在 C 中定义“任何类型的数据数组”的最低公分母——前提是接受这样一个数组的函数也接受一个值,该值告诉数组中有数据。我在暗示这一点,因为通常在处理 RT 音频时,减少延迟是最重要的,而仅仅为了类型兼容性而将数据复制到内存中可能是不明智的。
  • ...所以,如果你真的通过`cgo` 连接libalsa,你可能会问一个更广泛的问题。

标签: go pcm libalsa


【解决方案1】:

你可以试试这个:

package main

import "fmt"
import "bytes"
import "encoding/binary"

func main() {
    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("% x", buf.Bytes()) 
    }

}

【讨论】:

    猜你喜欢
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 2015-05-21
    • 1970-01-01
    • 2011-05-30
    • 2017-02-19
    • 1970-01-01
    相关资源
    最近更新 更多