public unsafe void AtualizarCRC() { Byte[] dados = toByteArray(); fixed(byte *pSrc = dados) { FormatoMensagemPaths *regiao = (FormatoMensagemPaths *)pSrc; this.crc = CalcularCRC(dados); } }
private bool VerificarCRC(byte[] dados) { unsafe { fixed(byte *pSrc = dados) { FormatoMensagemPaths *parametros = (FormatoMensagemPaths *)pSrc; return(parametros->crc == CalcularCRC(dados)); } } }
public void GerarFormatoNovo(string arquivoNome, string diretorioRaiz) { FileStream fs = File.OpenRead(arquivoNome + Util.Util.sequencial_arquivo_mensagens.ToString("X8") + Util.Util.ARQUIVO_EXT_MPT); byte[] dados = new byte[(int)fs.Length]; fs.Read(dados, 0, dados.Length); fs.Close(); unsafe { fixed(byte *pSrc = dados) { FormatoMensagemPaths *mensagemPaths = (FormatoMensagemPaths *)pSrc; this.versao = mensagemPaths->versao; this.reservado = mensagemPaths->reservado; this.idMensagem = mensagemPaths->idMensagem; for (int i = 0; i < 58; i++) { this.reservado2[i] = mensagemPaths->reservado2[i]; } this.crc = mensagemPaths->crc; this.pathVideo = Util.Util.TrataDiretorio(ArrayLDX2.ByteArrayToString(mensagemPaths->pathVideo, 64)); } //fs = File.OpenRead(diretorioRaiz + this.pathVideo); fs = File.OpenRead(this.pathVideo); byte[] dadosVideo = new byte[(int)fs.Length]; fs.Read(dadosVideo, 0, dadosVideo.Length); fs.Close(); Array.Resize(ref dados, (dados.Length - 64) + dadosVideo.Length); Array.Copy(dadosVideo, 0, dados, 64, dadosVideo.Length); fixed(byte *pSrc = dados) { FormatoMensagemPaths *mensagemPaths = (FormatoMensagemPaths *)pSrc; mensagemPaths->crc = CalcularCRC(dados); } fs = File.Create(arquivoNome + Util.Util.sequencial_arquivo_mensagens.ToString("X8") + Util.Util.ARQUIVO_EXT_MPT); fs.Write(dados, 0, dados.Length); fs.Close(); } }
public bool VerificarCRC(string caminhoMPT) { FileStream fs = File.OpenRead(caminhoMPT); byte[] dados = new byte[(int)fs.Length]; fs.Read(dados, 0, dados.Length); fs.Close(); unsafe { fixed(byte *pSrc = dados) { FormatoMensagemPaths *parametros = (FormatoMensagemPaths *)pSrc; return(parametros->crc == CalcularCRC(dados)); } } }
private unsafe UInt16 CalcularCRC(Byte[] dados) { int tamanho; Byte[] dadosCRC = new byte[dados.Length - sizeof(UInt16)]; fixed(byte *pSrc = dados) { FormatoMensagemPaths *regiao = (FormatoMensagemPaths *)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, dados.Length - ((int)®iao->crc - (int)pSrc + sizeof(UInt16))); return(CRC16CCITT.Calcular(dadosCRC)); } }
private void FromBytesToFormatoPainelCfg(byte[] dados) { unsafe { fixed(byte *pSrc = dados) { FormatoMensagemPaths *mensagemPaths = (FormatoMensagemPaths *)pSrc; this.versao = mensagemPaths->versao; this.reservado = mensagemPaths->reservado; this.idMensagem = mensagemPaths->idMensagem; for (int i = 0; i < 58; i++) { this.reservado2[i] = mensagemPaths->reservado2[i]; } this.crc = mensagemPaths->crc; this.pathVideo = ArrayLDX2.ByteArrayToString(mensagemPaths->pathVideo, 64); } } }
private byte[] toByteArray() { unsafe { Byte[] resultado = new Byte[sizeof(FormatoMensagemPaths)]; fixed(byte *pSrc = resultado) { FormatoMensagemPaths *mensagemPaths = (FormatoMensagemPaths *)pSrc; mensagemPaths->versao = this.versao; mensagemPaths->reservado = this.reservado; mensagemPaths->idMensagem = this.idMensagem; for (int i = 0; i < 58; i++) { mensagemPaths->reservado2[i] = this.reservado2[i]; } mensagemPaths->crc = this.crc; ArrayLDX2.StringToByteArray(mensagemPaths->pathVideo, this.pathVideo, 64); return(resultado); } } }
/// <summary> /// Traduz os bytes de dados arrayados para o formato novo. /// </summary> /// <param name="dados">Arquivo já lido do disco.</param> private void FromBytesToFormatoMPT(byte[] dados) { unsafe { fixed(byte *pSrc = dados) { FormatoMensagemPaths *mensagemPaths = (FormatoMensagemPaths *)pSrc; this.versao = mensagemPaths->versao; this.reservado = mensagemPaths->reservado; this.idMensagem = mensagemPaths->idMensagem; for (int i = 0; i < 58; i++) { this.reservado2[i] = mensagemPaths->reservado2[i]; } this.crc = mensagemPaths->crc; //a princípio, vamos pular esses 64 bytes. //this.pathVideo = ArrayLDX2.ByteArrayToString(mensagemPaths->pathVideo, 64); //limpa a lista de videos this.Videos.Clear(); //indice para leitura dos dados no arquivo. int indice = sizeof(FormatoMensagemPaths) - 64; //efetua a leitura do tamanho do vídeo.(próximos 4 bytes após o FormatoMensagemPaths) uint TamanhoArquivo = BitConverter.ToUInt32(dados, indice); //indice do inicio do arquivo a ser lido int indiceInicial = indice; //pula o tamanho. (já no conteúdo de vídeo.) indice = indice + sizeof(uint); //pula a versão. indice = indice + 1; //aloca o suficiente pra ler o vídeo. byte[] dadosVideo = new byte[TamanhoArquivo]; //copia os dados do arquivo de vídeo com o tamanho e versão. Array.Copy(dados, indiceInicial, dadosVideo, 0, TamanhoArquivo); //verifica o tipo do vídeo(v01 ou v02) ou se é Arquivo PLS..Equals("V01") String tipo = Encoding.ASCII.GetString(dados, indice, 3).ToUpper(); //todo: tentar substituir as strings e utilizar tipovideo. //caso o vídeo seja apenas vídeo e não PLS então será apenas UM arquivo de vídeo. switch (tipo) { case "V01": { // Instancia o video a partir do formato VideoV01 video = new VideoV01(); // Carrega através do ARRAY video.LoadFromBytes(dadosVideo); // Adiciona o video Videos.Add(video); } break; case "V02": { // Instancia o video a partir do formato VideoV02 video = new VideoV02(); // Carrega através do ARRAY video.LoadFromBytes(dadosVideo); // Adiciona o video Videos.Add(video); } break; case "V03": { } break; case "V04": { } break; case "PLS": { //Instancia o PLS. Arquivo_PLS please = new Arquivo_PLS(); please.LoadFromBytes(dadosVideo); foreach (Video video in please.listaVideos) { Videos.Add(video); } } break; } indice += dadosVideo.Length; } } }