package ber import ( "bytes" "fmt" ) func Dump(b []byte) string { return dump(bytes.NewBuffer(b), 0) } func short(b []byte) string { if len(b) > 5 { return fmt.Sprint(b[:5], " ...") } return fmt.Sprint(b) } func dump(r *bytes.Buffer, indent int) (s string) { class, kind, tag, _, value := Split(r) s += fmt.Sprintf("%*s", indent*2, "") switch class { case classUniversal: switch tag { case tagInteger: s += fmt.Sprintln(tag, UnmarshalInt(value)) case tagObjectIdentifier: s += fmt.Sprintln(tag, UnmarshalOID(value)) case tagBitString: s += fmt.Sprintln(tag, UnmarshalBitString(value)) case tagIA5String, tagOctetString: s += fmt.Sprintln(tag, string(value)) case tagBoolean: s += fmt.Sprintln(tag, UnmarshalBool(value[0])) default: s += fmt.Sprintln(tag, kind, short(value)) } default: s += fmt.Sprintln(class, kind, byte(tag), short(value)) } if len(value) > 0 && kind != kindPrimitive { s += dump(bytes.NewBuffer(value), indent+1) } if r.Len() > 0 { s += dump(r, indent) } return }