golang實現整型和位元組陣列之間的轉換操作
阿新 • • 發佈:2020-12-18
我就廢話不多說了,大家還是直接看程式碼吧~
//isSymbol表示有無符號 func BytesToInt(b []byte,isSymbol bool) (int,error){ if isSymbol { return bytesToIntS(b) } return bytesToIntU(b) } //位元組數(大端)組轉成int(無符號的) func bytesToIntU(b []byte) (int,error) { if len(b) == 3 { b = append([]byte{0},b...) } bytesBuffer := bytes.NewBuffer(b) switch len(b) { case 1: var tmp uint8 err := binary.Read(bytesBuffer,binary.BigEndian,&tmp) return int(tmp),err case 2: var tmp uint16 err := binary.Read(bytesBuffer,err case 4: var tmp uint32 err := binary.Read(bytesBuffer,err default: return 0,fmt.Errorf("%s","BytesToInt bytes lenth is invaild!") } } //位元組數(大端)組轉成int(有符號) func bytesToIntS(b []byte) (int,b...) } bytesBuffer := bytes.NewBuffer(b) switch len(b) { case 1: var tmp int8 err := binary.Read(bytesBuffer,err case 2: var tmp int16 err := binary.Read(bytesBuffer,err case 4: var tmp int32 err := binary.Read(bytesBuffer,"BytesToInt bytes lenth is invaild!") } } //整形轉換成位元組 func IntToBytes(n int,b byte) ([]byte,error) { switch b { case 1: tmp := int8(n) bytesBuffer := bytes.NewBuffer([]byte{}) binary.Write(bytesBuffer,&tmp) return bytesBuffer.Bytes(),nil case 2: tmp := int16(n) bytesBuffer := bytes.NewBuffer([]byte{}) binary.Write(bytesBuffer,nil case 3,4: tmp := int32(n) bytesBuffer := bytes.NewBuffer([]byte{}) binary.Write(bytesBuffer,nil } return nil,fmt.Errorf("IntToBytes b param is invaild") }
補充:golang整型,float與byte轉換
使用場景:
在tcp協議傳輸中,為了防止粘包,需要先發送訊息頭,即先發送資料長度,在根據長度write真正的資料,然e,由於網路傳輸都是位元組流,怎麼將整型轉為位元組流呢?
只需四步:
轉換----int轉int64
申請----申請一個位元組緩衝
寫入----按照二進位制,向緩衝寫入資料
取出----以位元組流從緩衝中取出
func IntToBytes(n int)[]byte{ data:=int64(n)//資料型別轉換 bytebuffer:=bytes.NewBuffer([]byte{})//位元組集合 binary.Write(bytebuffer,data)//按照二進位制寫入位元組 return bytebuffer.Bytes()//返回位元組結合 }
解碼同樣需兩步:
1.建立一個以位元組流為內容的buffer()
2.從buf緩衝讀取binary編碼的資料並賦給data
func BytesToInt(bs []byte)int{ bytebuffer:=bytes.NewBuffer(bs) //根據二進位制寫入二進位制結合 var data int64 binary.Read(bytebuffer,&data) //解碼 return int(data) }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。