私が行った方法は、読み取るバイト数 (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からのものです。