package ber import ( "fmt" ) func Dump(b []byte) string { return newState(b).dump(0) } func (s *state) primitive(h Header) string { if h.Class != classUniversal { return fmt.Sprint(s.next()) } switch h.Tag { case tagInteger, tagEnumerated: return fmt.Sprint(s.unmarshalInt()) case tagBoolean: return fmt.Sprint(s.unmarshalBool()) case tagObjectIdentifier: return fmt.Sprint(s.unmarshalOID()) case tagBitString: return fmt.Sprint(s.unmarshalBitString()) case tagIA5String: return fmt.Sprint(s.unmarshalString()) default: return fmt.Sprint(s.next()) } } 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", s.Len(), 2*indent, "") switch h.Kind { case kindPrimitive: ret += fmt.Sprintln(h, "=", s.primitive(h)) case kindConstructed: ret += fmt.Sprintln(h, "→") ret += s.subState().dump(indent + 1) } } return ret + s.dump(indent) }