golang实现整型和字节数组之间的转换操作
我就废话不多说了,大家还是直接看代码吧~
//isSymbol表示有无符号 funcBytesToInt(b[]byte,isSymbolbool)(int,error){ ifisSymbol{ returnbytesToIntS(b) } returnbytesToIntU(b) } //字节数(大端)组转成int(无符号的) funcbytesToIntU(b[]byte)(int,error){ iflen(b)==3{ b=append([]byte{0},b...) } bytesBuffer:=bytes.NewBuffer(b) switchlen(b){ case1: vartmpuint8 err:=binary.Read(bytesBuffer,binary.BigEndian,&tmp) returnint(tmp),err case2: vartmpuint16 err:=binary.Read(bytesBuffer,binary.BigEndian,&tmp) returnint(tmp),err case4: vartmpuint32 err:=binary.Read(bytesBuffer,binary.BigEndian,&tmp) returnint(tmp),err default: return0,fmt.Errorf("%s","BytesToIntbyteslenthisinvaild!") } } //字节数(大端)组转成int(有符号) funcbytesToIntS(b[]byte)(int,error){ iflen(b)==3{ b=append([]byte{0},b...) } bytesBuffer:=bytes.NewBuffer(b) switchlen(b){ case1: vartmpint8 err:=binary.Read(bytesBuffer,binary.BigEndian,&tmp) returnint(tmp),err case2: vartmpint16 err:=binary.Read(bytesBuffer,binary.BigEndian,&tmp) returnint(tmp),err case4: vartmpint32 err:=binary.Read(bytesBuffer,binary.BigEndian,&tmp) returnint(tmp),err default: return0,fmt.Errorf("%s","BytesToIntbyteslenthisinvaild!") } } //整形转换成字节 funcIntToBytes(nint,bbyte)([]byte,error){ switchb{ case1: tmp:=int8(n) bytesBuffer:=bytes.NewBuffer([]byte{}) binary.Write(bytesBuffer,binary.BigEndian,&tmp) returnbytesBuffer.Bytes(),nil case2: tmp:=int16(n) bytesBuffer:=bytes.NewBuffer([]byte{}) binary.Write(bytesBuffer,binary.BigEndian,&tmp) returnbytesBuffer.Bytes(),nil case3,4: tmp:=int32(n) bytesBuffer:=bytes.NewBuffer([]byte{}) binary.Write(bytesBuffer,binary.BigEndian,&tmp) returnbytesBuffer.Bytes(),nil } returnnil,fmt.Errorf("IntToBytesbparamisinvaild") }
补充:golang整型,float与byte转换
使用场景:
在tcp协议传输中,为了防止粘包,需要先发送消息头,即先发送数据长度,在根据长度write真正的数据,然e,由于网络传输都是字节流,怎么将整型转为字节流呢?
只需四步:
转换----int转int64
申请----申请一个字节缓冲
写入----按照二进制,向缓冲写入数据
取出----以字节流从缓冲中取出
funcIntToBytes(nint)[]byte{ data:=int64(n)//数据类型转换 bytebuffer:=bytes.NewBuffer([]byte{})//字节集合 binary.Write(bytebuffer,binary.BigEndian,data)//按照二进制写入字节 returnbytebuffer.Bytes()//返回字节结合 }
解码同样需两步:
1.创建一个以字节流为内容的buffer()
2.从buf缓冲读取binary编码的数据并赋给data
funcBytesToInt(bs[]byte)int{ bytebuffer:=bytes.NewBuffer(bs)//根据二进制写入二进制结合 vardataint64 binary.Read(bytebuffer,binary.BigEndian,&data)//解码 returnint(data) }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。