我正在64位平台上使用此C结构,尝试访问值联合中的ui32v字段:
struct _GNetSnmpVarBind {
guint32 *oid; /* name of the variable */
gsize oid_len; /* length of the name */
GNetSnmpVarBindType type; /* variable type / exception */
union {
gint32 i32; /* 32 bit signed */
guint32 ui32; /* 32 bit unsigned */
gint64 i64; /* 64 bit signed */
guint64 ui64; /* 64 bit unsigned */
guint8 *ui8v; /* 8 bit unsigned vector */
guint32 *ui32v; /* 32 bit unsigned vector */
} value; /* value of the variable */
gsize value_len; /* length of a vector in bytes */
};
我可以为每个并集元素编写一个C包装函数,但是出于教学目的,我宁愿在Go中工作。这是我尝试访问ui32v字段的方式:
func union_to_guint32_ptr(cbytes [8]byte) (result *_Ctype_guint32) {
buf := bytes.NewBuffer(cbytes[:])
var ptr uint64
if err := binary.Read(buf, binary.LittleEndian, &ptr); err == nil {
return (*_Ctype_guint32)(unsafe.Pointer(ptr))
}
return nil
}
但是这给出了一个错误,无法将ptr(uint64类型)转换为unsafe类型。
那么,如何做我转换一个UINT64将转至类型指向一个C guint32?我已经尝试了多种转换,分别转换为uintptr,然后转换为* _Ctype_guint32,转换为uintptr,然后使用unsafe.Pointer,...
我的理由是:我传递了8个字节的数组。将其转换为uint64,即内存地址。将其转换为指向guint32的指针(即guint32的C数组),并作为结果返回-联合字段“ value”为guint32 *。
德玛西亚99
明月笑刀无情
相关分类