public bool VerificarCRC(byte[] dados) { //const int posCRC1 = 62; //const int posCRC2 = 63; //Byte[] dados2 = this.ToBytes(); //FormatoAlternancia fa = ArquivoALTAssembly(dados); //List<byte> dadosValidos = new List<byte>(); //for (int i = 0; i < dados.Length; i++) //{ // if ((i == posCRC1) || (i == posCRC2)) // { // continue; // } // else // { // dadosValidos.Add(dados[i]); // } //} //ushort crc16 = (ushort)(dados[posCRC1] << 8); //crc16 += (ushort)(dados[posCRC2]); //ushort crc16_2 = CRC16CCITT.Calcular(dadosValidos.ToArray()); //ushort crc16_3 = CRC16CCITT.Calcular(dados); //return (CRC16CCITT.Calcular(dadosValidos.ToArray()) == crc16); unsafe { fixed(byte *pSrc = dados) { FormatoAlternancia *alternancia = (FormatoAlternancia *)pSrc; return(alternancia->crc == CalcularCRC(dados)); } } }
private unsafe UInt16 CalcularCRC(Byte[] dados) { Byte[] dadosCRC = new byte[dados.Length - sizeof(UInt16)]; fixed(byte *pSrc = dados) { FormatoAlternancia *alternancia = (FormatoAlternancia *)pSrc; Array.Copy(dados, 0, dadosCRC, 0, (int)&alternancia->crc - (int)pSrc); Array.Copy(dados, ((int)&alternancia->crc - (int)pSrc + sizeof(UInt16)), dadosCRC, (int)&alternancia->crc - (int)pSrc, dados.Length - ((int)&alternancia->crc - (int)pSrc + sizeof(UInt16))); return(CRC16CCITT.Calcular(dadosCRC)); } }
private byte[] toByteArray() { unsafe { Byte[] resultado = new Byte[sizeof(FormatoAlternancia)]; fixed(byte *pSrc = resultado) { FormatoAlternancia *fAlternancia = (FormatoAlternancia *)pSrc; fAlternancia->versao = this.versao; fAlternancia->QtdAlternancias = this.QuantidadeAlternancias; for (int i = 0; i < 60; i++) { fAlternancia->reservado[i] = this.reservado[i]; } fAlternancia->crc = this.crc; return(resultado); } } }