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} "); }