1 回答

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可能知道,這很危險(xiǎn),如果您要在生產(chǎn)應(yīng)用程序中執(zhí)行此操作,您最好有一個(gè)很好的理由。話雖如此...
你需要做幾件事。這是代碼,然后我們將遍歷它。
package main
import (
"fmt"
"os"
"strconv"
"unsafe"
)
func main() {
str := "7ffc47e43200" // strconv.ParseUint doesn't like a "0x" prefix
u, err := strconv.ParseUint(str, 16, 64)
if err != nil {
fmt.Fprintln(os.Stderr, "could not parse pointer:", err)
os.Exit(1)
}
ptr := unsafe.Pointer(uintptr(u)) // generic pointer (like void* in C)
intptr := (*int)(ptr) // typed pointer to int
fmt.Println(*intptr)
}
您可以在Go Playground上運(yùn)行它。
首先,我們需要將字符串解析為數(shù)值。在您的示例中,您給出了一個(gè)十六進(jìn)制數(shù),因此我們將以 16 為基數(shù)進(jìn)行解析(即 16 的“16”參數(shù)strconv.ParseUint)。請注意,strconv.ParseUint它不喜歡“0x”前綴,因此我將其刪除。
然后,我們需要將數(shù)字轉(zhuǎn)換為指針類型。為此,我們將使用unsafe.PointerGo 編譯器特有的類型。通常,編譯器不會讓您在指針類型之間進(jìn)行轉(zhuǎn)換。例外是,根據(jù)unsafe.Pointer文檔:
任何類型的指針值都可以轉(zhuǎn)換為指針。
指針可以轉(zhuǎn)換為任何類型的指針值。
uintptr 可以轉(zhuǎn)換為指針。
指針可以轉(zhuǎn)換為 uintptr。
因此,為了轉(zhuǎn)換為指針,我們需要先轉(zhuǎn)換為 auintptr然后再轉(zhuǎn)換為 a unsafe.Pointer。從這里,我們可以轉(zhuǎn)換為我們想要的任何指針類型。在此示例中,我們將轉(zhuǎn)換為 int 指針,但我們也可以選擇任何其他指針類型。然后我們?nèi)∠弥羔槪ㄔ谶@種情況下會出現(xiàn)恐慌)。
- 1 回答
- 0 關(guān)注
- 169 瀏覽
添加回答
舉報(bào)