如何在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")

}

}

我想读contentRecord 我已经问了几个相关问题。

我已经阅读了一些文章和帖子,但仍然找不到解决方法。

回答:

我认为您正在以错误的方式进行操作。如果要使用C库,则可以使用C库读取文件。

不要纯粹使用cgo来拥有结构定义,您应该在Go中自己创建它们。然后,您可以编写适当的编组/解组代码以从原始字节读取。

快速的Google显示,有人已经完成了将相关C库的外观转换为Go所需的工作。请参阅utmp信息库。

一个简短的示例说明了如何使用它:

package main

import (

"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

回到顶部