public unsafe void AtualizarCRC() { Byte[] dados = toByteArray(); fixed(byte *pSrc = dados) { FormatoPainelCfg *parametros = (FormatoPainelCfg *)pSrc; this.crc = CalcularCRC(dados); } }
public bool VerificarCRC(byte[] dados) { unsafe { fixed(byte *pSrc = dados) { FormatoPainelCfg *config = (FormatoPainelCfg *)pSrc; return(config->crc == CalcularCRC(dados)); } } }
private unsafe UInt16 CalcularCRC(Byte[] dados) { int tamanho; Byte[] dadosCRC = new byte[dados.Length - sizeof(UInt16)]; fixed(byte *pSrc = dados) { FormatoPainelCfg *parametros = (FormatoPainelCfg *)pSrc; Array.Copy(dados, 0, dadosCRC, 0, (int)¶metros->crc - (int)pSrc); Array.Copy(dados, ((int)¶metros->crc - (int)pSrc + sizeof(UInt16)), dadosCRC, (int)¶metros->crc - (int)pSrc, dados.Length - ((int)¶metros->crc - (int)pSrc + sizeof(UInt16))); return(CRC16CCITT.Calcular(dadosCRC)); } }
private byte[] toByteArray() { List <byte> dados = new List <byte>(); List <UInt32> listaOffset = new List <uint>(); unsafe { Byte[] resultado = new Byte[sizeof(FormatoPainelCfg)]; FormatoPainelCfg config = new FormatoPainelCfg(); config.versao = (Byte)this.versao; //if (this.VideosSaudacao.Count > 0) //{ listaOffset.Add((uint)(sizeof(FormatoPainelCfg) - 4)); foreach (IVideo video in videosMensagensEspeciais) { if (video is VideoV01) { dados.AddRange((video as VideoV01).ToBytes()); } else if (video is VideoV02) { dados.AddRange((video as VideoV02).ToBytes()); } listaOffset.Add((uint)(sizeof(FormatoPainelCfg) - 4 + dados.Count)); } //} } unsafe { Byte[] resultado = new Byte[sizeof(FormatoPainelCfg) - 4 + dados.Count]; fixed(byte *pSrc = resultado) { FormatoPainelCfg *config = (FormatoPainelCfg *)pSrc; config->versao = (Byte)this.versao; config->alternanciaSelecionada = (Byte)this.alternanciaSelecionada; config->altura = this.altura; config->largura = this.largura; fontePath.PadRight(50, '\0'); for (int i = 0; i < fontePath.Length; i++) { config->fontePath[i] = (byte)this.fontePath[i]; } config->crc = this.crc; config->mensagem_selecionada = this.mensagemSelecionada; //adicionado na versao 2 do painel CFG config->mensagem_Secselecionada = this.mensagemSecSelecionada; config->offsetBomDia = listaOffset[0]; config->offsetBoaTarde = listaOffset[1]; config->offsetBoaNoite = listaOffset[2]; //adição dos campos config->offsetTextoSaida = listaOffset[3]; config->offsetSimboloTarifa = listaOffset[4]; config->offsetUnidadeTemperatura = listaOffset[5]; config->offsetUnidadeVelocidade = listaOffset[6]; config->offsetLabelSegunda = listaOffset[7]; config->offsetLabelTerca = listaOffset[8]; config->offsetLabelQuarta = listaOffset[9]; config->offsetLabelQuinta = listaOffset[10]; config->offsetLabelSexta = listaOffset[11]; config->offsetLabelSabado = listaOffset[12]; config->offsetLabelDomingo = listaOffset[13]; config->offsetExtensaoHoraAM = listaOffset[14]; config->offsetExtensaoHoraPM = listaOffset[15]; //adição dos parametrosfixos em painel.cfg config->somenteHora = this.somenteHora; config->dataHora = this.dataHora; config->horaSaida = this.horaSaida; config->temperatura = this.temperatura; config->tarifa = this.tarifa; config->horaTemperatura = this.horaTemperatura; config->velocidade = this.velocidade; config->dataHoraTemp = this.dataHoraTemp; config->BrilhoMax = this.BrilhoMax; config->BrilhoMin = this.BrilhoMin; byte *temp = (byte *)&config->videosMensagensEspeciais; for (int i = 0; i < dados.Count; i++) { temp[i] = dados[i]; } //byte* temp2 = (byte*)&config->mensagem_Secselecionada; //for (int i = 0; i < sizeof(UInt16); i++) //{ // temp2[i] = BitConverter.GetBytes(this.mensagemSecSelecionada)[i]; //} //adicionado na versao 2 do painel CFG //config->mensagem_Secselecionada = this.mensagemSecSelecionada; } return(resultado); } }
private void FromBytesToFormatoPainelCfg(byte[] dados) { unsafe { fixed(byte *pSrc = dados) { FormatoPainelCfg *config = (FormatoPainelCfg *)pSrc; this.versao = config->versao; this.alternanciaSelecionada = config->alternanciaSelecionada; this.altura = config->altura; this.largura = config->largura; for (int i = 0; i < 50; i++) { this.fontePath = this.fontePath + (char)config->fontePath[i]; } this.crc = config->crc; this.mensagemSelecionada = config->mensagem_selecionada; //adicionado na versao 2 do painel CFG this.mensagemSecSelecionada = config->mensagem_Secselecionada; //adição dos parametrosfixos no painel.cfg this.somenteHora = config->somenteHora; this.dataHora = config->dataHora; this.horaSaida = config->horaSaida; this.temperatura = config->temperatura; this.tarifa = config->tarifa; this.horaTemperatura = config->horaTemperatura; this.velocidade = config->velocidade; this.dataHoraTemp = config->dataHoraTemp; this.BrilhoMax = config->BrilhoMax; this.BrilhoMin = config->BrilhoMin; this.videosMensagensEspeciais.Clear(); int indice = (int)(sizeof(FormatoPainelCfg) - 4); for (int i = 0; i < 16; i++) { int indiceInicial = indice; // Pegar o tamanho do Arquivo uint tamanhoArquivo = BitConverter.ToUInt32(dados, indice); byte[] dadosVideo = new byte[tamanhoArquivo]; // Atualiza o indice com o tamanho do arquivo indice += sizeof(uint); // Pular a versão indice++; Array.Copy(dados, indiceInicial, dadosVideo, 0, tamanhoArquivo); // Pegar o formato do Arquivo Ex.: V02 if (Encoding.ASCII.GetString(dados, indice, 3).ToUpper().Equals("V01")) { // Instancia o video a partir do formato VideoV01 video = new VideoV01(); // Carrega através do ARRAY video.LoadFromBytes(dadosVideo); // Adiciona o video videosMensagensEspeciais.Add(video); indice += dadosVideo.Length; } else if (Encoding.ASCII.GetString(dados, indice, 3).ToUpper().Equals("V02")) { // Instancia o video a partir do formato VideoV02 video = new VideoV02(); // Carrega através do ARRAY video.LoadFromBytes(dadosVideo); // Adiciona o video videosMensagensEspeciais.Add(video); indice += dadosVideo.Length; } //barata, adicionei isso aqui. o índice tava cagado. indice = indice - sizeof(uint); indice = indice - 1; } } } }