我这样做的方法是找到要读取的字节数(guint32 * oid_len 的大小),然后对字节数执行 binary.Read(),然后循环遍历大小块中的字节。回想起来容易;困难的部分是让类型转换工作,因为 Go 比 C 更严格。
例如,这里是将 guint32* 转换为 Go 字符串(表示 SNMP OID)的 Go 代码:
func gIntArrayOidString(oid *_Ctype_guint32, oid_len _Ctype_gsize) (result string) {
size := int(unsafe.Sizeof(*oid))
length := int(oid_len)
gbytes := C.GoBytes(unsafe.Pointer(oid), (_Ctype_int)(size*length))
buf := bytes.NewBuffer(gbytes)
for i := 0; i < length; i++ {
var out uint32
if err := binary.Read(buf, binary.LittleEndian, &out); err == nil {
result += fmt.Sprintf(".%d", out)
} else {
return "<error converting oid>"
}
}
if len(result) > 1 {
return result[1:] // strip leading dot
}
return "<error converting oid>"
}
注释?
上下文:代码来自gsnmpgo。