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