我就废话不多说了,大家还是直接看代码吧~
//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,整型,字节数组
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
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
![](https://img.aspxhome.com/file/2023/8/121158_0s.jpg)
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
![](https://img.aspxhome.com/file/2023/7/68967_0s.jpg)
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