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)&parametros->crc - (int)pSrc);
                Array.Copy(dados, ((int)&parametros->crc - (int)pSrc + sizeof(UInt16)), dadosCRC,
                           (int)&parametros->crc - (int)pSrc,
                           dados.Length - ((int)&parametros->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;
                    }
                }
            }
        }