1. 程式人生 > 程式設計 >golang實現整型和位元組陣列之間的轉換操作

golang實現整型和位元組陣列之間的轉換操作

我就廢話不多說了,大家還是直接看程式碼吧~

//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)
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。