gpt4 book ai didi

go - CGO:在 LPCWSTR 和字符串之间转换

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

我正在为一个库编写 CGO 绑定(bind),该库将 LPCWSTR 用于其所有字符串类型。如何将 C.LPCWSTR 转换为 string,反之亦然?

最佳答案

您应该能够将LPCWSTR“转换”为[]uint16,并使用utf16 包解码字符

// take a C.wstr pointer, and convert it to a go slice
// `sz` is the length of the LPCWSTR
wstr := (*[1 << 30-1]uint16)(unsafe.Pointer(C.wstr))[:sz:sz]
runes := utf16.Decode(wstr)
goString := string(runes)

您通常不希望将 Go 指针传递到您的 C 代码中,因此当从字符串转换为 LPCWSTR 时,您需要在 C 中分配内存。从 Go 字符串转换的解决方案 s 可能看起来像:

func Encode(s string) C.LPCWSTR {
wstr := utf16.Encode([]rune(s))

p := C.calloc(C.size_t(len(wstr)+1), C.sizeof_uint16_t)
pp := (*[1 << 30]uint16)(p)
copy(pp[:], wstr)

return (C.LPCWSTR)(p)
}

可能还有一些 MFC 宏可以帮助与 cstrings 相互转换,您可以使用 C 中的简单包装函数来利用这些宏。这样您就可以轻松地使用内置 C 将数据传入和传出.CStringC.GoString 函数。

关于go - CGO:在 LPCWSTR 和字符串之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38926687/

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