golang实现整型和字节数组之间的转换操作

 更新时间:2020年12月18日 08:39:52   作者:思维的深度  
这篇文章主要介绍了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, binary.BigEndian, &tmp)
 return int(tmp), err
 case 4:
 var tmp uint32
 err := binary.Read(bytesBuffer, binary.BigEndian, &tmp)
 return int(tmp), err
 default:
 return 0,fmt.Errorf("%s", "BytesToInt bytes lenth is invaild!")
 }
}

//字节数(大端)组转成int(有符号)
func bytesToIntS(b []byte) (int, error) {
 if len(b) == 3 {
 b = append([]byte{0},b...)
 }
 bytesBuffer := bytes.NewBuffer(b)
 switch len(b) {
 case 1:
 var tmp int8
 err := binary.Read(bytesBuffer, binary.BigEndian, &tmp)
 return int(tmp), err
 case 2:
 var tmp int16
 err := binary.Read(bytesBuffer, binary.BigEndian, &tmp)
 return int(tmp), err
 case 4:
 var tmp int32
 err := binary.Read(bytesBuffer, binary.BigEndian, &tmp)
 return int(tmp), err
 default:
 return 0,fmt.Errorf("%s", "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, binary.BigEndian, &tmp)
 return bytesBuffer.Bytes(),nil
 case 2:
 tmp := int16(n)
 bytesBuffer := bytes.NewBuffer([]byte{})
 binary.Write(bytesBuffer, binary.BigEndian, &tmp)
 return bytesBuffer.Bytes(),nil
 case 3,4:
 tmp := int32(n)
 bytesBuffer := bytes.NewBuffer([]byte{})
 binary.Write(bytesBuffer, binary.BigEndian, &tmp)
 return bytesBuffer.Bytes(),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,binary.BigEndian,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,binary.BigEndian,&data) //解码
 return int(data)
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • go语言LeetCode题解1030距离顺序排列矩阵单元格

    go语言LeetCode题解1030距离顺序排列矩阵单元格

    这篇文章主要为大家介绍了go语言LeetCode题解1030距离顺序排列矩阵单元格,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Go语言Goroutinue和管道效率详解

    Go语言Goroutinue和管道效率详解

    这篇文章主要为大家介绍了Go语言Goroutinue和管道效率使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • GO语言实现简单TCP服务的方法

    GO语言实现简单TCP服务的方法

    这篇文章主要介绍了GO语言实现简单TCP服务的方法,实例分析了Go语言实现TCP服务的技巧,需要的朋友可以参考下
    2015-03-03
  • Go 语言入门学习之正则表达式

    Go 语言入门学习之正则表达式

    这篇文章主要介绍了Go 语言入门学习之正则表达式,文章基于GO语言的相关资料展开详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • Go语言执行系统命令行命令的方法

    Go语言执行系统命令行命令的方法

    这篇文章主要介绍了Go语言执行系统命令行命令的方法,实例分析了Go语言操作系统命令行的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 浅谈golang 的高效编码细节

    浅谈golang 的高效编码细节

    本文主要介绍了golang 的高效编码细节,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • goland 搭建 gin 框架的步骤详解

    goland 搭建 gin 框架的步骤详解

    这篇文章主要介绍了goland 搭建 gin 框架的相关知识,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Go语言命令行操作命令详细介绍

    Go语言命令行操作命令详细介绍

    这篇文章主要介绍了Go语言命令行操作命令详细介绍,本文重点介绍了go build、go clean、go fmt、go get等命令,需要的朋友可以参考下
    2014-10-10
  • go中sync.RWMutex的源码解读

    go中sync.RWMutex的源码解读

    本文主要介绍了go中sync.RWMutex的源码解读,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04
  • golang使用sync.singleflight解决热点缓存穿透问题

    golang使用sync.singleflight解决热点缓存穿透问题

    在go的sync包中,有一个singleflight包,里面有一个 singleflight.go文件,代码加注释,一共200行出头,通过 singleflight可以很容易实现缓存和去重的效果,避免重复计算,接下来我们就给大家详细介绍一下sync.singleflight如何解决热点缓存穿透问题
    2023-07-07

最新评论