gpt4 book ai didi

utf-8 - 在 Go 中使用 C 库时,如何正确地将 UTF-8 编码的 char 数组转换为 Go 字符串?

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

我正在尝试在 Go 中使用 C 库。 C.PrlFoundVmInfo_GetName 函数将 UTF-8 编码的字符串写入 name,长度为 nBufSize

// PRL_CHAR sName[1024];
var sName [1024]C.PRL_CHAR
// PRL_UINT32 nBufSize = sizeof(sName);
var nBufSize C.PRL_UINT32 = C.PRL_UINT32(unsafe.Sizeof(sName))
ret = C.PrlFoundVmInfo_GetName(hFoundVmInfo, (*C.PRL_CHAR)(unsafe.Pointer(&sName)), &nBufSize)
// printf("VM name: %s\n", sName);
var gName string = C.GoString((*C.char)(unsafe.Pointer(&sName)))
fmt.Printf("VM %d name: \"%s\"\n", nBufSize, gName)

声明 name(和 nBufSize)的正确方法是什么?我如何将 name 转换为 Go string?上面的代码没有像我预期的那样工作。它打印:

VM 1024 name: ""
...

C API 文档,摘录

PrlFoundVmInfo_GetName - 参数

PRL_RESULT PrlFoundVmInfo_GetName(
PRL_HANDLE handle,
PRL_STR sName,
PRL_UINT32_PTR pnNameBufLength
);
  • handle - 标识容器的 PHT_FOUND_VM_INFO 类型的句柄。
  • sName - [out] 指向接收名称的缓冲区的指针。传递空指针以确定所需的缓冲区大小。
  • pnNameBufLength - [in] 用于接收输出数据的缓冲区大小(以字节为单位)。 [out] 如果缓冲区参数包含空指针或指定的缓冲区大小不够大,则需要缓冲区大小。

完整文档可在 C API Documentation - PrlFoundVmInfo_GetName 获得

最佳答案

Command cgo

Go references to C

A few special functions convert between Go and C types by making copies of the data. In pseudo-Go definitions:

// C string, length to Go string
func C.GoStringN(*C.char, C.int) string

The Go Blog: C? Go? Cgo!

关于utf-8 - 在 Go 中使用 C 库时,如何正确地将 UTF-8 编码的 char 数组转换为 Go 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21502191/

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