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

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

Golang:不安全的動態字節數組

Golang:不安全的動態字節數組

Go
HUWWW 2021-07-02 14:07:20
我正在嘗試使用 Go 與 Windows dll 交互。我想使用的 dll 函數接受一個指向字節數組的指針。因此我需要給它那個字節數組。我使用的系統調用libary調用DLL,這表現在這里。我的基本要求是:我得到了字節數組所需的大小我創建了字節數組我必須得到一個指向字節數組的指針然后我將指針傳遞給 Windows dll我不知道如何在 go 中創建一個字節數組,并獲得一個指向它的指針。這顯然是一個不安全的操作,不安全庫可能會有所幫助,但我首先需要創建一個動態長度的字節數組。使用“make”創建切片對我沒有幫助,除非我可以獲得指向切片的后備數組的指針。有沒有其他人遇到過這個或有任何想法?
查看完整描述

2 回答

?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

好吧,我找到了一個粗略的解決方案。顯然,切片的結構包含一個指向支持字節數組的指針、支持字節數組的長度以及支持字節數組的容量。


我只對指向字節數組的指針感興趣,所以我只需要切片內部數據的第一個成員。


Gounsafe.Pointer不會將切片轉換為不安全指針,但會將指向切片的指針轉換為不安全指針。由于我可以將不安全指針強制轉換為我想要的任何舊類型的指針,因此我可以將其強制轉換為指向指針的指針,從而恢復切片內部數據的第一個成員。


這是一個工作示例。我想要一個,uintptr但你可以將它轉換為任何指針類型。


package main


import (

    "fmt"

    "unsafe"

)


func main() {

    // Arbitrary size

    n := 4


    // Create a slice of the correct size

    m := make([]int, n)


    // Use convoluted indirection to cast the first few bytes of the slice

    // to an unsafe uintptr

    mPtr := *(*uintptr)(unsafe.Pointer(&m))


    // Check it worked

    m[0] = 987

    // (we have to recast the uintptr to a *int to examine it)

    fmt.Println(m[0], *(*int)(unsafe.Pointer(mPtr)))

}

如果你想要一個*int,你可以做mPtr := *(**int)(unsafe.Pointer(&m))


只要切片維護此內部數據結構,這就會起作用。我絕對愿意接受不依賴于 Go 內部結構的更強大的解決方案。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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