binary.Write()字节顺序不适用于[]字节

时间:2016-12-28 15:51:33

标签: go

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,是否需要先撤消?有没有有效的方法来解决这个问题?

感谢。

2 个答案:

答案 0 :(得分:1)

只有字节排序才能交换整数类型。

当它是一片字节时,二进制包就不知道要交换什么。

例如,如果您传递1k数据,它将如何知道该怎么做?

将其视为int16,int32或int64?

或者你会期望它只是扭转整个切片?

答案 1 :(得分:1)

因为没有什么可以订购的。一个字节是8位,所以你可以从0到255(无符号)。即。 uint16你有2个字节,所以你可以用不同的方式订购它们。

甚至没有为int8定义

ByteOrder。您可以查看source code,看看binary.Write只是在类型为uint8int8时才使用传递的订单。 (byteuint8)的别名