真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語(yǔ)言中byte go語(yǔ)言中文社區(qū)

golang 中結(jié)構(gòu)體與字節(jié)數(shù)組能相互轉(zhuǎn)化么

結(jié)構(gòu)體與[]byte不能直接轉(zhuǎn)化,可以通過gob來轉(zhuǎn)換。

創(chuàng)新互聯(lián)公司主要從事網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)鯉城,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

編碼時(shí)如下,假設(shè)默認(rèn)的結(jié)構(gòu)體為data

func Encode(data interface{}) ([]byte, error) { buf := bytes.NewBuffer(nil) enc := gob.NewEncoder(buf) err := enc.Encode(data) if err != nil { return nil, err } return buf.Bytes(), nil }解碼時(shí)如下,data為需要解碼的字節(jié)數(shù)組,to為相應(yīng)的接收結(jié)構(gòu)體,記住to的結(jié)構(gòu)體結(jié)構(gòu)應(yīng)與被編碼的data相一致,解碼后內(nèi)容保存在to里面,直接使用to即可

func Decode(data []byte, to interface{}) error { buf := bytes.NewBuffer(data) dec := gob.NewDecoder(buf) return dec.Decode(to) }使用的時(shí)候:

b, err := Encode(data) if err != nil { //錯(cuò)誤處理 } if err := Decode(b, to); err != nil { //錯(cuò)誤處理}

Golang bytes.buffer詳解

Buffer 介紹

Buffer 是 bytes 包中的一個(gè) type Buffer struct{…}

A buffer is a variable-sized buffer of bytes with Read and Write methods. The zero value for Buffer is an empty buffer ready to use.

(是一個(gè)變長(zhǎng)的 buffer,具有 Read 和Write 方法。 Buffer 的 零值 是一個(gè) 空的 buffer,但是可以使用)

Buffer 就像一個(gè)集裝箱容器,可以存東西,取東西(存取數(shù)據(jù))

創(chuàng)建緩沖器

輸出

寫入到緩沖器

buffer在new的時(shí)候是空的,也是可以直接Write的

Write

結(jié)果

WriteString

結(jié)果

WriteByte

WriteRune

結(jié)果

從緩沖器中寫出

讀出緩沖器

Read

ReadByte

返回緩沖器頭部的第一個(gè)byte

ReadRun

ReadRune方法,返回緩沖器頭部的第一個(gè)rune

為什么n==3,而n1==1呢?我們看下ReadRune 的源碼

ReadBytes

ReadBytes方法,需要一個(gè)byte作為分隔符,讀的時(shí)候從緩沖器里找出第一個(gè)出現(xiàn)的分隔符,緩沖器頭部開始到分隔符之間的byte返回。

相當(dāng)于有一個(gè)分隔符

ReadString

和readBytes方法類似

讀入緩沖器

ReadFrom方法,從一個(gè)實(shí)現(xiàn)io.Reader接口的r,把r的內(nèi)容讀到緩沖器里,n返回讀的數(shù)量

從緩沖器取出

Next方法,返回前n個(gè)byte(slice),原緩沖器變

緩沖區(qū)原理介紹

go字節(jié)緩沖區(qū)底層以字節(jié)切片做存儲(chǔ),切片存在長(zhǎng)度len與容量cap, 緩沖區(qū)寫從長(zhǎng)度len的位置開始寫,當(dāng)lencap時(shí),會(huì)自動(dòng)擴(kuò)容。緩沖區(qū)讀會(huì)從內(nèi)置標(biāo)記off位置開始讀(off始終記錄讀的起始位置),當(dāng)off==len時(shí),表明緩沖區(qū)已全部讀完

并重置緩沖區(qū)(len=off=0),此外當(dāng)將要內(nèi)容長(zhǎng)度+已寫的長(zhǎng)度(即len) = cap/2時(shí),緩沖區(qū)前移覆蓋掉已讀的內(nèi)容(off=0,len-=off),從避免緩沖區(qū)不斷擴(kuò)容

如何將golangbyte轉(zhuǎn)換為字符串

func BytesToString(bs []byte) string {

l := len(bs)

buf := make([]string, 0, l)

for i := 0; i l; i++ {

buf = appendString(buf, bs[i])

}

return strings.Join(buf, dot)

}

func appendString(bs []string, b byte) []string {

var a byte

var s int

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

a = b

b = 1

b = 1

switch a {

case b:

s += 0

default:

temp := 1

for j := 0; j 7 - i; j++ {

temp = temp*2

}

s += temp

}

b = 1

}

return append(bs, strconv.Itoa(s))

}

Go語(yǔ)言中的字節(jié)序

Go中的binary包實(shí)現(xiàn)了簡(jiǎn)單的數(shù)字與字節(jié)序列的轉(zhuǎn)換以及變長(zhǎng)值的編解碼

package main

import ( "fmt" "bytes" "encoding/binary" ) func main(){ n := 0x12345678 bytesBuffer := bytes.NewBuffer([]byte{}) //BigEndian 大端順序存儲(chǔ) LittleEndian小端順序存儲(chǔ) 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) //操作的都是無(wú)符號(hào)整型 binary.BigEndian.PutUint32(data,uint32(n))

可以使用下面的方式判斷當(dāng)前系統(tǒng)的字節(jié)序類型

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

//判斷我們系統(tǒng)中的字節(jié)序類型 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") } }


當(dāng)前標(biāo)題:go語(yǔ)言中byte go語(yǔ)言中文社區(qū)
鏈接地址:http://weahome.cn/article/docecss.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部