将 C 字符串转换为 Go 字符串,无需 CGO

标签 c go cgo

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

如果可能的话,我想避免 CGO,因为 Windows 上 CGO 代码的两个选项(交叉编译和在 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)

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

相关文章:

windows - os.File.SetReadDealine : file type does not support deadline

c - 通过Cgo访问aerospike C客户端报错

go - 如何分发具有 C 依赖项的 Go 模块

go - 在 VScode 中安装 Bazel for Golang 构建应用程序

dictionary - Golang map 内部实现 - 它如何在 map 中搜索键?

go - (*[1 << 30]C.YourType) 在 CGo 中到底做了什么?

C 标准库的完整在线引用?

c - 我试图使这段代码递归,但由于某种原因它不起作用

c - 浮点文字 “.1” 与 C 中的 “0.1” 相同吗?

c - C 中的函数参数更改