Go语言中的字节序

Python08

Go语言中的字节序,第1张

Go中的binary包实现了简单的数字与字节序列的转换以及变长值的编解码

package main

import ( "fmt" "bytes" "encoding/binary" ) func main(){ n := 0x12345678 bytesBuffer := bytes.NewBuffer([]byte{}) //BigEndian 大端顺序存储 LittleEndian小端顺序存储 binary.Write(bytesBuffer, binary.BigEndian, int32(n)) data:=bytesBuffer.Bytes() fmt.Printf("[0]: %#x addr:%#x\n",data[0],&data[0]) fmt.Printf("[0]: %#x addr:%#x\n",data[1],&data[1]) fmt.Printf("[0]: %#x addr:%#x\n",data[2],&data[2]) fmt.Printf("[0]: %#x addr:%#x\n",data[3],&data[3]) }

输出

[0]: 0x12 addr:0xc042010248 [1]: 0x34 addr:0xc042010249 [2]: 0x56 addr:0xc04201024a [3]: 0x78 addr:0xc04201024b

可以使用下面的方式

n := 0x12345678 var data []byte = make([]byte,4) //操作的都是无符号整型 binary.BigEndian.PutUint32(data,uint32(n))

可以使用下面的方式判断当前系统的字节序类型

const INT_SIZE int = int(unsafe.Sizeof(0))

//判断我们系统中的字节序类型 func systemEdian() { var i int = 0x1 bs := (*[INT_SIZE]byte)(unsafe.Pointer(&i)) if bs[0] == 0 { fmt.Println("system edian is little endian") } else { fmt.Println("system edian is big endian") } }

任何学习都不会为时过晚,只要你想学!Go语言是字节跳动内部使用最多的编程语言。为啥?因为字节跳动更看重效率,Go语言上手简单,学习难度低。另外, 如果你的第一语言是PHP,或者Python,或者C#,并且职位是后端工程师,那我强烈建议你现在开始学Go。不是鼓吹Go,是我觉得这是趋势,我们不管是写程序,还是做其他事情,都应该顺应时代。可以学习一下极客时间里毛剑的课,非常不错!

func ByteToBinaryString(data byte) (str string) {

var a byte

for i:=0i <8i++ {

a = data

data <<= 1

data >>= 1

switch (a) {

case data: str += "0"

default: str += "1"

}

data <<= 1

}

return str

}

//该代码片段来自于: http://www.sharejs.com/codes/go/4357

使用方法package main

import . "fmt"

func main() {

Printf("[%s][%s][%s][%s]\n",

ByteToBinaryString(byte(0)),ByteToBinaryString(byte(231)),

ByteToBinaryString(byte(168)), ByteToBinaryString(byte(162)))

}