Go 如何写入最低24位单元?

Go 如何写入最低24位单元?,go,Go,我可以用二进制写32位。用上面的代码写。如果我想写uint32的最低24位,我可以用binary.write来写。或者我最好提取每个最低的8位,并将它们写入字节数组 // vim: set noexpandtab tabstop=2: package main import ( "log" "os" "encoding/binary" ) func main() { x := uint32(1)

我可以用二进制写32位。用上面的代码写。如果我想写uint32的最低24位,我可以用binary.write来写。或者我最好提取每个最低的8位,并将它们写入字节数组

// vim: set noexpandtab tabstop=2:

package main

import (
    "log"
    "os"
    "encoding/binary"
)

func main() {
    x := uint32(1)
    err := binary.Write(os.Stdout, binary.LittleEndian, x)
    if err != nil { log.Fatal(err) }
}

您可以通过两种方式执行此操作:

通用内联;或 自定义类型 一般的

利用任何io.Writer(如os.Stdout)的本机写入方法:

快跑./main.go | xxd 00000000: 0102 03 自定义类型

定义自定义类型和方法并匹配接口:

w := os.Stdout      // any io.Writer
x := uint32(197121) // any bit-shift capable type, uint64 etc.

// little-endian order
w.Write([]byte{
    byte(x),
    byte(x >> 8),
    byte(x >> 16),
})
使用:

type int24 int32

func (x int24) WriteTo(w io.Writer) (int64, error) {
        n, err := w.Write([]byte{
                byte(x),
                byte(x >> 8),
                byte(x >> 16),
        })
        return int64(n), err
}
%开始跑步。/custom.go | xxd 00000000: 0102 0301 0200 0100 00
不知道go,但一种方法是使用FF000000和dest int32,然后使用源int24。可以这样更快

这感觉像是XY问题。你在这里更大的目标是什么?要将一个上限为24位的数字序列写入io.Writer?可能需要创建自己的类型int24 int32,并实现自己的io.Reader以用于此类型?@colm.anseo您可以提供代码吗?这可能是一个,用于命名约定和错误处理。某些人确实获得了所需的较低位。但是OP询问如何有效地将其写入io编写器。对于所有标准类型int32、int64等,都有二进制编码器来实现这一点,但对于自定义类型,则没有二进制编码器,因此需要编写自己的编码器。
type int24 int32

func (x int24) WriteTo(w io.Writer) (int64, error) {
        n, err := w.Write([]byte{
                byte(x),
                byte(x >> 8),
                byte(x >> 16),
        })
        return int64(n), err
}
for _, v := range []int24{
    197121, // 01 02 03
    513,    // 01 02 00
    1,      // 01 00 00
} {
    v.WriteTo(os.Stdout)
}