gpt4 book ai didi

不使用 CGO 将 C 字符串转换为 Go 字符串

转载 作者:IT王子 更新时间:2023-10-29 01:35:43 25 4
gpt4 key购买 nike

我正在使用 Go Windows 系统调用库从 DLL 中的函数中获取数据。这一切都很好,但我想不出一种方法来将 LPCTSTR(指向 C 字符串的指针)转换为正确的 Go 字符串而不使用 CGO

我想尽可能避免使用 CGO,因为 CGO 代码在 Windows 上的两个选项(交叉编译和在 Windows 上安装 gcc)仍然相当复杂。

最佳答案

如果您有一个 8 位字符串,您可以将 LPCTSTR 指针转换为适当大小的 []byte,并将其复制到一个新的字符串或 slice 。

a := (*[1 << 30-1]byte)(unsafe.Pointer(lpctstr))
size := bytes.IndexByte(a[:], 0)
// if you just want a string
// goString := string(a[:size:size])

// if you want a slice pointing to the original memory location without a copy
// goBytes := a[:size:size]

goBytes := make([]byte, size)
copy(goBytes, a)

如果 LPCTSTR 指向包含 16 位 unicode 字符的 LPCWSTR,则可以使用 utf16 包将其转换。

a := (*[1 << 30-1]uint16)(unsafe.Pointer(lpctstr))
size := 0
for ; size < len(a); size++ {
if a[size] == uint16(0) {
break
}
}
runes := utf16.Decode(a[:size:size])
goString := string(runes)

关于不使用 CGO 将 C 字符串转换为 Go 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41267069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com