英文:
binary.Write() byte ordering not working for []byte
问题
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
类型却不起作用?
如果需要按照 binary.LittleEndian
的顺序对 []byte
进行排序并写入 bytes.Buffer
,是否需要先进行反转?有没有有效的方法来解决这个问题?
谢谢。
英文:
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]
}
It is very interesting, why binary.Write()
byte ordering is working for uint8, uint16, uint64
..etc, but []byte
?
If []byte
need to be ordered by binary.LittleEndian
and write to bytes.Buffer
, it needs to be reversed first? Is there any effective ways to solve this problem?
Thanks.
答案1
得分: 2
只有整数类型会受到字节顺序的影响。
当处理字节切片时,二进制包不会真正知道要进行什么样的交换。
例如,如果你传递了1k的数据,它会如何知道该怎么做呢?
将其视为int16、int32或int64吗?
还是你希望它只是将整个切片反转?
英文:
Only integer types get swapped by byte ordering.
When it's a slice of bytes, the binary package wouldn't really know what to swap.
For example, how would it know what to do if you passed 1k of data?
Treat it as int16, int32 or int64?
Or would you expect it to just reverse the whole slice?
答案2
得分: 2
因为没有需要排序的内容。一个字节是8位,所以你可以(无符号地)从0到255进行排序。例如,uint16
有2个字节,所以你可以以不同的顺序对它们进行排序。
对于int8
,甚至没有定义ByteOrder
。你可以查看源代码,可以看到当类型为uint8
或int8
时,binary.Write
根本不使用传递的顺序。(byte
是uint8
的别名)
英文:
Because there is nothing to order by. A byte is 8 bits, so you can go (unsigned) from 0 to 255. ie. uint16
you have 2 bytes, so you can order them differently.
ByteOrder
is not even defined for int8
. You can check the source code to see that binary.Write
simply not uses the passed order when types are uint8
or int8
. (A byte
is an alias to uint8
)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论