如何在go中将字节转换为struct(c struct)?
package main
/*#define _GNU_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <utmpx.h>
#include <fcntl.h>
#include <unistd.h>
char *path_utmpx = _PATH_UTMPX;
typedef struct utmpx utmpx;
*/
import "C"
import (
"fmt"
"io/ioutil"
)
type Record C.utmpx
func main() {
path := C.GoString(C.path_utmpx)
content, err := ioutil.ReadFile(path)
handleError(err)
var records []Record
// now we have the bytes(content), the struct(Record/C.utmpx)
// how can I cast bytes to struct ?
}
func handleError(err error) {
if err != nil {
panic("bad")
}
}
我想读content
入Record
我已经问了几个相关问题。
我已经阅读了一些文章和帖子,但仍然找不到解决方法。
回答:
我认为您正在以错误的方式进行操作。如果要使用C库,则可以使用C库读取文件。
不要纯粹使用cgo来拥有结构定义,您应该在Go中自己创建它们。然后,您可以编写适当的编组/解组代码以从原始字节读取。
快速的Google显示,有人已经完成了将相关C库的外观转换为Go所需的工作。请参阅utmp信息库。
一个简短的示例说明了如何使用它:
package mainimport (
"bytes"
"fmt"
"log"
"github.com/ericlagergren/go-gnulib/utmp"
)
func handleError(err error) {
if err != nil {
log.Fatal(err)
}
}
func byteToStr(b []byte) string {
i := bytes.IndexByte(b, 0)
if i == -1 {
i = len(b)
}
return string(b[:i])
}
func main() {
list, err := utmp.ReadUtmp(utmp.UtmpxFile, 0)
handleError(err)
for _, u := range list {
fmt.Println(byteToStr(u.User[:]))
}
}
您可以查看软件包的GoDoc以utmp
获得更多信息。
以上是 如何在go中将字节转换为struct(c struct)? 的全部内容, 来源链接: utcz.com/qa/411592.html