当前位置: 首页 > article >正文

go 内存二进制数据操作

go 内存二进制数据操作

go 内存二进制数据直接操作

以数字类型为例

int(linux/macos 为int32,windows 为int64). 如果不清楚可以使用unsafe.Sizeof函数来查看(函数出来的值*8就是int位数)

若不使用内存二进制数据操作,你需要在每次获取数字内容时调用binary.BigEndian/LittleEndian的方法来计算出数字大小。而具体是大端还是小端计算由系统决定.(win 小端,linux/macos 大端)

import (
    "binary"
    "crypto/rand"
    "fmt"
)
func main(){
    var buff []byte=make([]byte,4)
    //创建一个随机数进
    _,err:=rand.Reader.Read(buff)
    if err!=nil{
        panic("random number failed "+err.Error())
    }
    //获取这个随机数的值
    fmt.Println(binary.BigEndian.Uint32(buff))
}

直接操纵内存获取

import (
    "unsafe"
    "crypto/rand"
)
type Pointer[T any] struct{
    T *T
    buff []byte
}

func NewPointer[T any]()*Pointer[T]{
    var t T
    var ans = &Pointer[T]{buff:make([]byte,unsafe.Sizeof(t))}//获取类型占用内存字节数
    ans.T=(*T)(unsafe.Pointer(&ans.buff[0]))//将指针关联过去
    return ans
}
func (s *Pointer[T])Bytes()[]byte{
    return s.buff
}
func main(){
    ptr:=NewPointer[int]()
    _,err:=rand.Reader.Read(ptr.Bytes())
    if err!=nil{
        panic("random number failed "+err.Error())
    }
    fmt.Println(*ptr.T)//就像读取正常指针一样读取
}

多种类型复用同一块内存

//以混合两种类型作为示范
type Union[T1 any,T2 any] struct{
    T1 *T1
    T2 *T2
    b []byte
}

func NewUnion[T1 any,T2 any]()*Union[T1,T2]{
    var (
        t1 T1
        t2 T2
    )
    maxsize:=unsafe.Sizeof(t1)
    t2size:=unsafe.Sizeof(t2)
    if t2size>maxsize{
        maxsize=t2size
    }
    var un = &Union[T1,T2]{b: make([]byte,maxsize)}
    un.T1=(*T1)(unsafe.Pointer(&un.b[0]))
    un.T2=(*T2)(unsafe.Pointer(&un.b[0]))
    return un
}
func (s *Union[T1,T2])Bytes()[]byte{
    return s.b
}
func main(){
    un:=NewUnion[int,float64]()
    *un.T1 = 23//存储23 int值
    *un.T2 = 178.5//需要作为float类型是设置为float类型
}

http://www.kler.cn/a/231892.html

相关文章:

  • 【51单片机】LCD1602液晶显示屏
  • Zotero 7本地pdf文件名自适应中英文格式
  • 基于STM32的智能温室控制系统设计
  • mybatis的动态sql用法之排序
  • 力扣刷题日记之150.逆波兰表达式求值
  • Qwen2.5-Coder-32B-Instruct Docker 部署openai接口
  • Redis——缓存设计与优化
  • Python面试题13-18
  • vue3 mathjax2.7.7 数学公式
  • Chrome 沙箱逃逸 -- Plaid CTF 2020 mojo
  • 服务器运存使用率多少正常?
  • Spring Cloud Netflix Eureka的参数调优
  • 在windows的控制台实现贪吃蛇小游戏
  • 预测模型:MATLAB线性回归
  • 【芯片设计- RTL 数字逻辑设计入门 11.1 -- 状态机实现 移位运算与乘法 1】
  • 8.0 Zookeeper 四字命令教程详解
  • ruoyi-nbcio中xxl-job的安装与使用
  • C# async/await的使用
  • Java微服务学习Day1
  • facebook广告投流有几种方式
  • XSS攻击 - 不要再硬背了
  • svg基础(五)滤镜-高斯模糊,混合模式,偏移,颜色变换
  • [C/C++] -- JSON for Modern C++
  • Centos 内存和硬盘占用情况以及top作用
  • JVM 性能调优 - 参数基础(2)
  • Java实现批量视频抽帧2.0