为了账号安全,请及时绑定邮箱和手机立即绑定

如何写出最低的 24 位单元?

如何写出最低的 24 位单元?

Go
白衣染霜花 2022-06-13 15:35:44
// vim: set noexpandtab tabstop=2:package mainimport (    "log"    "os"    "encoding/binary")func main() {    x := uint32(1)    err := binary.Write(os.Stdout, binary.LittleEndian, x)    if err != nil { log.Fatal(err) }}binary.Write我可以通过上面的代码写 32 位。如果我想写 uint32 的最低 24 位,我可以用binary.Write. 或者我最好提取每个最低 8 位并将它们写为字节数组?$ go run main.go | xxd00000000: 0100 0000                                ....
查看完整描述

2 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

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


通用内联;或者

自定义类型

通用的


利用Write任何io.Writer类似的本机方法os.Stdout:


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

})

https://play.golang.org/p/9WSUpX8zYcw


go run ./main.go | xxd

00000000: 0102 03

自定义类型


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


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)

}

https://play.golang.org/p/IdfM6s_Ytpn


% go run ./custom.go |xxd

00000000: 0102 0301 0200 0100 00


查看完整回答
反对 回复 2022-06-13
?
慕斯709654

TA贡献1840条经验 获得超5个赞

不知道去,但一种方法是用 FF000000 与 dest int32 与,然后与源 int24 或与。可以像这样更快



查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信