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

作者:思维的深度 时间:2024-02-11 00:13:08 

我就废话不多说了,大家还是直接看代码吧~


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

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

来源:https://skaygo.blog.csdn.net/article/details/80751229

标签:golang,整型,字节数组
0
投稿

猜你喜欢

  • Vue过滤器的用法和自定义过滤器使用

    2024-05-09 10:41:20
  • Python greenlet实现原理和使用示例

    2023-10-02 08:22:25
  • django中间键重定向实例方法

    2021-04-17 12:34:02
  • mysql delete 多表连接删除功能

    2024-01-21 15:02:41
  • 如何让IIS支持wap,让ASP生成wml

    2008-05-18 13:42:00
  • 解决Go语言time包数字与时间相乘的问题

    2023-08-06 17:07:55
  • Pytorch 使用tensor特定条件判断索引

    2023-01-18 16:30:23
  • js读取图片的宽和高

    2007-08-04 10:14:00
  • 用C#对ADO.NET数据库完成简单操作的方法

    2024-01-15 09:12:58
  • JavaScript奇怪的比较——隐式类型转换

    2009-02-15 13:06:00
  • php中ob_flush函数和flush函数用法分析

    2023-11-15 06:12:59
  • 深入浅析python继承问题

    2023-05-20 15:22:26
  • JScript RuntimeObject检测全局污染

    2010-09-13 12:26:00
  • 深入浅析PHP的session反序列化漏洞问题

    2024-05-13 09:51:14
  • Python中extend和append的区别讲解

    2021-03-28 04:20:37
  • python 基于dlib库的人脸检测的实现

    2022-08-23 22:59:07
  • js不能获取隐藏的div的宽度只能先显示后获取

    2024-04-17 10:25:17
  • 深入理解ES6 Promise 扩展always方法

    2024-04-18 09:46:46
  • Golang巧用defer进行错误处理的方法

    2023-08-05 03:21:13
  • python利用hook技术破解https的实例代码

    2021-10-24 17:20:15
  • asp之家 网络编程 m.aspxhome.com