package main
import (
"encoding/binary"
"fmt"
"bytes"
)
func main(){
b := new(bytes.Buffer)
c := new(bytes.Buffer)
binary.Write(b, binary.LittleEndian, []byte{0, 1})
binary.Write(b, binary.BigEndian, []byte{0, 1})
binary.Write(c, binary.LittleEndian, uint16(256))
binary.Write(c, binary.BigEndian, uint16(256))
fmt.Println(b.Bytes()) // [0 1 0 1]
fmt.Println(c.Bytes()) // [0 1 1 0]
}
非常有趣,为什么binary.Write()
字节排序适用于uint8, uint16, uint64
等等,但是[]byte
?
如果[]byte
需要binary.LittleEndian
订购并写入bytes.Buffer
,是否需要先撤消?有没有有效的方法来解决这个问题?
感谢。
答案 0 :(得分:1)
只有字节排序才能交换整数类型。
当它是一片字节时,二进制包就不知道要交换什么。
例如,如果您传递1k数据,它将如何知道该怎么做?
将其视为int16,int32或int64?
或者你会期望它只是扭转整个切片?
答案 1 :(得分:1)
因为没有什么可以订购的。一个字节是8位,所以你可以从0到255(无符号)。即。 uint16
你有2个字节,所以你可以用不同的方式订购它们。
int8
定义 ByteOrder
。您可以查看source code,看看binary.Write
只是在类型为uint8
或int8
时才使用传递的订单。 (byte
是uint8
)的别名