private byte[] toByteArray() { unsafe { Byte[] resultado = new Byte[sizeof(FormatoMensagem)]; fixed(byte *pSrc = resultado) { FormatoMensagem *mensagem = (FormatoMensagem *)pSrc; mensagem->versao = this.versao; mensagem->reservado = this.reservado; mensagem->id = this.id; ArrayLDX2.StringToByteArray(mensagem->labelMensagem, this.labelMensagem, 20); for (int i = 0; i < 38; i++) { mensagem->reservado2[i] = this.reservado2[i]; } mensagem->crc = this.crc; return(resultado); } } }
public unsafe void AtualizarCRC() { Byte[] dados = toByteArray(); fixed(byte *pSrc = dados) { FormatoMensagem *regiao = (FormatoMensagem *)pSrc; this.crc = CalcularCRC(dados); } }
public bool VerificarCRC(byte[] dados) { unsafe { fixed(byte *pSrc = dados) { FormatoMensagem *parametros = (FormatoMensagem *)pSrc; return(parametros->crc == CalcularCRC(dados)); } } }
private unsafe UInt16 CalcularCRC(Byte[] dados) { int tamanho; Byte[] dadosCRC = new byte[sizeof(FormatoMensagem) - sizeof(UInt16)]; fixed(byte *pSrc = dados) { FormatoMensagem *regiao = (FormatoMensagem *)pSrc; Array.Copy(dados, 0, dadosCRC, 0, (int)®iao->crc - (int)pSrc); Array.Copy(dados, ((int)®iao->crc - (int)pSrc + sizeof(UInt16)), dadosCRC, (int)®iao->crc - (int)pSrc, sizeof(FormatoMensagem) - ((int)®iao->crc - (int)pSrc + sizeof(UInt16))); return(CRC16CCITT.Calcular(dadosCRC)); } }
private void FromBytesToFormatoPainelCfg(byte[] dados) { unsafe { fixed(byte *pSrc = dados) { FormatoMensagem *mensagem = (FormatoMensagem *)pSrc; this.versao = mensagem->versao; this.reservado = mensagem->reservado; this.id = mensagem->id; this.labelMensagem = ArrayLDX2.ByteArrayToString(mensagem->labelMensagem, 20); for (int i = 0; i < 38; i++) { this.reservado2[i] = mensagem->reservado2[i]; } this.crc = mensagem->crc; } } }