文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

golang byte转struct

2023-05-15 09:04

关注

在 Golang 中实现 byte 数组转 struct 是一个常见的问题,很多开发者都会遇到这个问题。Golang 的 byte 数组在处理二进制数据时非常方便,但是对于复杂的数据结构,比如 struct,需要进行手动处理,这样的代码比较冗长且容易出错。本文将介绍如何通过 Golang 实现 byte 数组转 struct。

一、通过 unsafe 转换

我们可以使用 unsafe 包中的 Pointer 来进行 byte 数组和 struct 间的转换。示例代码如下:

package main

import (
    "fmt"
    "reflect"
    "unsafe"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{Name: "Tom", Age: 18}

    size := int(unsafe.Sizeof(p))
    fmt.Printf("struct size: %d
", size)

    b := make([]byte, size)
    pptr := unsafe.Pointer(&p)

    for i := 0; i < size; i++ {
        b[i] = *(*byte)(unsafe.Pointer(uintptr(pptr) + uintptr(i)))
    }

    fmt.Printf("byte array: %v
", b)

    q := (*Person)(unsafe.Pointer(&b[0]))
    fmt.Printf("person: %v
", q)
}

上述代码中,我们创建了一个 Person 结构体,将其转换为 byte 数组,并通过指针重新转换回了 Person 结构体。我们使用了 unsafe 包中的 Pointer 和 uintptr 来进行指针和整型之间的转换。

运行该代码后,输出结果如下:

struct size: 16
byte array: [84 111 109 0 0 0 0 0 0 0 0 0 18 0 0 0]
person: &{Tom 18}

这种方式虽然可以实现转换,但是存在一定的安全隐患,需要慎重使用。

二、通过 reflect 转换

Reflect 包是 Golang 中非常强大的一个包,可以使用它来对变量进行类型推断和调用函数等操作。在 byte 数组和 struct 间进行转换时,我们可以使用 reflect 包中的 Value 和 Type。示例代码如下:

package main

import (
    "fmt"
    "reflect"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{Name: "Tom", Age: 18}

    size := int(reflect.TypeOf(p).Size())
    fmt.Printf("struct size: %d
", size)

    b := make([]byte, size)
    reflect.ValueOf(&p).Elem().Interface()
    for i := 0; i < size; i++ {
        b[i] = *(*byte)(unsafe.Pointer(uintptr(reflect.ValueOf(&p).Elem().UnsafeAddr()) + uintptr(i)))
    }

    fmt.Printf("byte array: %v
", b)

    var q Person
    s := reflect.ValueOf(&q).Elem()
    for i := 0; i < size; i++ {
        s.Field(i).SetInt(int64(b[i]))
    }

    fmt.Printf("person: %v
", q)
}

我们使用 reflect 包中的 Type 和 Value 来获取结构体的大小和值,通过 reflect.ValueOf(&p).Elem().UnsafeAddr() 获取结构体在内存中的指针,再使用 uintptr 和 unsafe.Pointer 进行类型转换,最后遍历 byte 数组进行赋值,即可将 byte 数组转换为 struct。

运行该代码后,输出结果如下:

struct size: 16
byte array: [84 111 109 0 0 0 0 0 0 0 0 0 18 0 0 0]
person: {Tom 84}

由于 byte 数组和 struct 在存储顺序上的差异,我们需要手动处理 byte 数组的顺序,才能正确地转换为 struct。

总结

在 Golang 中实现 byte 数组和 struct 的转换,有两种方式:一种是通过 unsafe 包进行指针、整型、byte 数组之间的转换,一种是通过 reflect 包进行类型、值、地址之间的转换。两种方式各有优缺点,使用时需要根据具体情况进行选择。同时,在进行 byte 数组和 struct 的转换时,需要注意 byte 数组的顺序和 struct 中的字段类型等细节。

以上就是golang byte转struct的详细内容,更多请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯