public unsafe void AtualizarCRC() { Byte[] dados = toByteArray(); fixed(byte *pSrc = dados) { FormatoAgenda *agenda = (FormatoAgenda *)pSrc; this.crc = CalcularCRC(dados); } }
public bool VerificarCRC(Byte[] dados) { unsafe { fixed(byte *pSrc = dados) { FormatoAgenda *parametros = (FormatoAgenda *)pSrc; return(parametros->crc == CalcularCRC(dados)); } } }
private void FromBytesToFormatoPainelCfg(byte[] dados) { unsafe { fixed(byte *pSrc = dados) { FormatoAgenda *roteiros = (FormatoAgenda *)pSrc; this.versao = roteiros->versao; this.reservado = roteiros->reservado; this.crc = roteiros->crc; } } }
private unsafe UInt16 CalcularCRC(Byte[] dados) { Byte[] dadosCRC = new byte[dados.Length - sizeof(UInt16)]; fixed(byte *pSrc = dados) { FormatoAgenda *agenda = (FormatoAgenda *)pSrc; Array.Copy(dados, 0, dadosCRC, 0, (int)&agenda->crc - (int)pSrc); Array.Copy(dados, ((int)&agenda->crc - (int)pSrc + sizeof(UInt16)), dadosCRC, (int)&agenda->crc - (int)pSrc, dados.Length - ((int)&agenda->crc - (int)pSrc + sizeof(UInt16))); return(CRC16CCITT.Calcular(dadosCRC)); } }
private byte[] toByteArray() { unsafe { Byte[] resultado = new Byte[sizeof(FormatoAgenda)]; fixed(byte *pSrc = resultado) { FormatoAgenda *agenda = (FormatoAgenda *)pSrc; agenda->versao = this.versao; agenda->reservado = this.reservado; agenda->qntItens = (UInt16)this.itens.Count; agenda->crc = this.crc; unsafe { Byte[] resultado2 = new Byte[this.itens.Count * sizeof(Agendamento)]; Agendamento *temp = (Agendamento *)&agenda->itens; for (int i = 0; i < this.itens.Count; i++) { resultado2[(i * sizeof(Agendamento))] = this.itens[i].segundos; resultado2[(i * sizeof(Agendamento)) + 1] = this.itens[i].minutos; resultado2[(i * sizeof(Agendamento)) + 2] = this.itens[i].horas; resultado2[(i * sizeof(Agendamento)) + 3] = this.itens[i].dia; resultado2[(i * sizeof(Agendamento)) + 4] = this.itens[i].mes; resultado2[(i * sizeof(Agendamento)) + 5] = this.itens[i].diaSemana; BitConverter.GetBytes(this.itens[i].ano).CopyTo(resultado2, (i * sizeof(Agendamento)) + 6); resultado2[(i * sizeof(Agendamento)) + 8] = this.itens[i].mascara; resultado2[(i * sizeof(Agendamento)) + 9] = this.itens[i].painel; resultado2[(i * sizeof(Agendamento)) + 10] = 0xff; resultado2[(i * sizeof(Agendamento)) + 11] = this.itens[i].operacao; BitConverter.GetBytes(this.itens[i].valorParametro).CopyTo(resultado2, (i * sizeof(Agendamento)) + 12); resultado2[(i * sizeof(Agendamento)) + 14] = 0xff; // 2 Bytes reservados. resultado2[(i * sizeof(Agendamento)) + 15] = 0xff; // 2 Bytes reservados. } //byte* temp2 = (byte*)&agenda->itens; //for (int i = 0; i<resultado2.Length;i++) //{ // resultado2[i] = temp2[i]; //} Array.Resize <byte>(ref resultado, (resultado.Length + resultado2.Length) - sizeof(Int32)); resultado2.CopyTo(resultado, 64); ushort crc16 = CalcularCRC(resultado); byte[] dadosCRC = BitConverter.GetBytes(crc16); dadosCRC.CopyTo(resultado, 62); } return(resultado); } } }