public string Pirnt()
        {
            return($@"
                Assuming base64-encoded packet
                {_packet.Base64String()}

                Message Type = Data
                  PHYPayload =   {_packet.ToHexString()}

                ( PHYPayload   = MHDR[1] | MACPayload[..] | MIC[4] )
                        MHDR   =   {BitConverter.ToString(new byte[] { _packet[0] })}
                  MACPayload   =   {MACPayload.ToHexString()}
                         MIC   =    {MIC.ToHexString()} (from packet)  {(MIC.ToHexString() != MICChecker.MIC.ToHexString()?"INVALID":"") }
                               =    {MICChecker.MIC.ToHexString()} (expected, assuming 32 bits frame counter below 65,536)

                ( MACPayload   =  FHDR | FPort | FRMPayload )
                      FHDR     = {FHDR.ToString()}
                      FPort    = {Fport.ToHexString()}
                    FRMPayload = {FRMPayload.ToHexString()} (from packet, encrypted)
                               = {DecryptFRMPayload().Item2} (decrypted)

                ( FHDR = DevAddr[4] | FCtrl[1] | FCnt[2] | FOpts[0..15] )
                     DevAddr = {FHDR.DevAddr.ToHexString()} (Big Endian)
                       FCtrl = {FHDR.FCTRL.ToString()}
                        FCnt = {FHDR.FCnt.ToHexString()} (Big Endian)
                       FOpts = {FHDR.FOpts.ToHexString()}

                        Message Type = {mhdr.MType.ToString()}
                           Direction = {((mhdr.MType == MType.UnconfirmedDataUp || mhdr.MType == MType.ConfirmedDataUp) ? "Up" : "Down") }
                                FCnt = {FHDR.FCnt.ToInt16()}
                           FCtrl.ACK = {FHDR.FCTRL.ACK}
                           FCtrl.ADR = {FHDR.FCTRL.ADR}

");
        }