package ber import ( "fmt" ) func Dump(b []byte) string { return newState(b).dump(0) } func (s *state) dump(indent int) (ret string) { if s.Len() == 0 { return "" } for s.Len() > 0 { h := s.unmarshalClass() ret += fmt.Sprintf("%3d: %*s%v: ", s.Len(), 2*indent, "", h) if h.Class == classUniversal && h.Kind == kindPrimitive { switch h.Tag { case tagInteger, tagEnumerated: ret += fmt.Sprintln(s.unmarshalInt()) case tagBoolean: ret += fmt.Sprintln(s.unmarshalBool()) case tagObjectIdentifier: ret += fmt.Sprintln(s.unmarshalOID()) case tagBitString: ret += fmt.Sprintln(s.unmarshalBitString()) case tagIA5String, tagOctetString: ret += fmt.Sprintln(s.unmarshalString()) default: ret += fmt.Sprintln(s.next()) } } else { ret += fmt.Sprintln("→") ret += s.subState().dump(indent + 1) } } return ret + s.dump(indent) }