亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 中將結構體內容復制到 uint64

在 Go 中將結構體內容復制到 uint64

Go
慕田峪7331174 2021-06-18 08:11:18
我想將結構的值復制到 uint64 中,沒有不安全的正確方法是什么?package mainimport "fmt"type T struct {    id [7]byte    no uint8}func main() {    t1 := T{[7]byte{'A', 'B', 'C', 'D', 'E', 'F', 'G'}, 7}    var u uint64    //TODO: copy t1's content into u (both id and no)    //u = *((*uint64)(unsafe.Pointer(&t1)))    fmt.Println(t1, u)}
查看完整描述

2 回答

?
UYOU

TA貢獻1878條經驗 獲得超4個贊

例如,在小端架構上,不使用 package unsafe,


package main


import (

    "fmt"

    "unsafe"

)


type T struct {

    id [7]byte

    no uint8

}


func Uint64LEFromT(t T) uint64 {

    return uint64(t.id[0]) | uint64(t.id[1])<<8 | uint64(t.id[2])<<16 | uint64(t.id[3])<<24 |

        uint64(t.id[4])<<32 | uint64(t.id[5])<<40 | uint64(t.id[6])<<48 | uint64(t.no)<<56

}


func Uint64LEToT(t *T, v uint64) {

    t.id[0] = byte(v)

    t.id[1] = byte(v >> 8)

    t.id[2] = byte(v >> 16)

    t.id[3] = byte(v >> 24)

    t.id[4] = byte(v >> 32)

    t.id[5] = byte(v >> 40)

    t.id[6] = byte(v >> 48)

    t.no = byte(v >> 56)

}


func main() {

    t1, t2 := T{[7]byte{'A', 'B', 'C', 'D', 'E', 'F', 'G'}, 7}, T{}

    var u1, u2 uint64


    //TODO: copy t1's content into u1 (both id and no)

    u1 = *((*uint64)(unsafe.Pointer(&t1)))

    fmt.Printf("t1 to u1 (unsafe): t1 %X u1 %X\n", t1, u1)


    //DONE:

    u2 = Uint64LEFromT(t1)

    fmt.Printf("t1 to u2 (safe):   t1 %X u2 %X\n", t1, u2)

    Uint64LEToT(&t2, u2)

    fmt.Printf("u2 to t2 (safe):   t2 %X u2 %X\n", t2, u2)

}

輸出:


t1 to u1 (unsafe): t1 {41424344454647 7} u1 747464544434241

t1 to u2 (safe):   t1 {41424344454647 7} u2 747464544434241

u2 to t2 (safe):   t2 {41424344454647 7} u2 747464544434241


查看完整回答
反對 回復 2021-06-21
  • 2 回答
  • 0 關注
  • 219 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號