golang struct 和 []byte 互轉


example1

type MyStruct struct {
    A int
    B int
}

var sizeOfMyStruct = int(unsafe.Sizeof(MyStruct{}))

func MyStructToBytes(s *MyStruct) []byte {
    var x reflect.SliceHeader
    x.Len = sizeOfMyStruct
    x.Cap = sizeOfMyStruct
    x.Data = uintptr(unsafe.Pointer(s))
    return *(*[]byte)(unsafe.Pointer(&x))
}

func BytesToMyStruct(b []byte) *MyStruct {
    return (*MyStruct)(unsafe.Pointer(
        (*reflect.SliceHeader)(unsafe.Pointer(&b)).Data,
    ))
}

example2

import (
    "fmt"
    "unsafe"
)
type TestStructTobytes struct {
    data int64
}
type SliceMock struct {
    addr uintptr
    len  int
    cap  int
}

func main() {

    var testStruct = &TestStructTobytes{100}
    Len := unsafe.Sizeof(*testStruct)
    testBytes := &SliceMock{
        addr: uintptr(unsafe.Pointer(testStruct)),
        cap:  int(Len),
        len:  int(Len),
    }
    data := *(*[]byte)(unsafe.Pointer(testBytes))
    fmt.Println("[]byte is : ", data)
    var ptestStruct *TestStructTobytes = *(**TestStructTobytes)(unsafe.Pointer(&data))
    fmt.Println("ptestStruct.data is : ", ptestStruct.data)
}

// 由於在golang中編譯器不將[]byte視為指針,所以要使用其地址進行轉換,由於[]byte底層存放的是指向數據的地址。用[]byte的地址就需要使用雙層指針轉換,然后再指向其內容,得出來的就是轉換對應struct的指針了。

高效的字符串和字節數組轉換

func bytes2str(b []byte) string {
	return *(*string)(unsafe.Pointer(&b))
}

func str2bytes(s string) []byte {
	x := (*[2]uintptr)(unsafe.Pointer(&s)) // 獲取s的起始地址開始后的兩個 uintptr 指針
	h := [3]uintptr{x[0], x[1], x[1]}      // 構造三個指針數組
	return *(*[]byte)(unsafe.Pointer(&h))
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM