Fórum Dúvida sobre arquivos binários (TFileStream) #311556
03/02/2006
0
TTeste1 = packed record Texto : String[15]; Inteiro : Integer; end;
Depois rodei o seguinte código:
var p:TFileStream; s:TTeste1; begin s.Texto := ´MEU TEXTO´; s.Inteiro := 0; // p := TFileStream.Create(´C:\teste1.txt´,fmCreate); p.Write(s,SizeOf(TTeste1)); FreeAndNil(p); end;
Agora se eu abrir esse arquivo verei que a string aparece no arquivo como uma string mesmo, ou melhor, não fica escondida. Já número inteiro aparece como um caractere estranho. Um detalhe: Se ao invés de 0 eu tentar gravar qualquer outro número, como por exemplo 4, a string aparece com caracteres estranhos (como se estivesse criptografada). Essa seria a primeira dúvida. A segunda vem agora e é baseada na primeira. Criei um outro tipo:
TTeste2 = packed record Texto : String[15]; Inteiro : Integer; Letras : Array[1..8] of Integer; end;
Como já aconteceu algumas vezes da string em meu arquivo gerado aparecer, resolvi fazer esse teste para tentar gravar a string de uma forma diferente. Vejam só. Rodei os seguinte código:
var p:TFileStream; s:TTeste2; t:string; i:integer; begin t := ´MEUTEXTO´; for i := 1 to Length(t) do s.Letras[i] := Ord(t[i]); // s.Texto := ´MEU TEXTO´; s.Inteiro := 0; // p := TFileStream.Create(´C:\teste2.txt´,fmCreate); p.Write(s,SizeOf(TTeste2)); FreeAndNil(p); end;
Meu raciocínio foi o seguinte: Já que às vezes a string aparece sem ´proteção´ e os inteiros aparecem sempre como caracteres estranhos, vou converter cada caractere para inteiro e gravá-los como um array. Mas para minha surpresa, ao abrir o arquivo gerado, vi que apesar de eu ter gravado os inteiros, a string ´MEUTEXTO´ apareceu assim:
´M E U T E X T O´
Como isso é possível? E nesse novo teste não adianta o inteiro que estiver sendo gravado, tanto a string como a array de inteiros aparecem com os caracteres ´originais´, ou melhor, ´sem proteção´.
O que quero dizer é: se uma pessoa abre o arquivo no bloco de notas ela identifica rapidamente onde está uma determinada string. Imaginem se eu estivesse gravando uma senha por exemplo. E teoricamente, nem adiantaria usar uma string criptografada porque de qualquer maneira ela fica destacada de uma maneira que um usuário um pouquinho mais experiente já nota que aquela parte é um texto criptografado restando a partir daí descobrir o método utilizado para conseguir desfazer. Por quê se eu abrir um arquivo do excel ou do word no bloco de notas aparecem grande parte de caracteres ´estranhos´. Algumas strings aparecem, mas as importantes não ficam tão aparente...
Não consigo entender como funcionam esses arquivos no computador.
Uma outra coisa que eu queria entender era: Peguei um arquivo salvo pelo excel ou word e abri no bloco de notas. Vasculhei o arquivo todo procurando uma string. Achei uma string por exemplo ´meu texto para testes´. Se eu trocar uma letra dessa string pelo bloco de notas o arquivo já não abre mais. Diz que está corrompido. E eu não entendo isso também porque teoricamente eu estou trocando um caractere por outro. Como o programa consegue entender que o arquivo foi mechido?
Phew, são muitas questões... Se alguém puder me dar uma luz, agradeço.
Até!
Delphi32
Curtir tópico
+ 0Posts
03/02/2006
Massuda
Como você está usando o Bloco de Notas, esse programa vai tentar converter tudo que está no arquivo em algo que possa ser exibido.
Tudo que for Char e string será exibido sem problemas, pois como o que é armazenado são os caracteres, já é algo que pode ser exibido.
No caso dos demais tipos de dados (Integer, Double, etc), o que é gravado é a representação interna/nativa dos dados. Quando o bloco de notas abre isso, ele imagina que tudo são caracteres e assim os exibe. Um byte contendo o número 65 será exibido como sendo a letra A no Bloco de Notas.
No caso do seu array Letras[], como ele contem os códigos das letras da string, o Bloco de Notas irá desfazer a conversão de letra para código, retornando assim as letras originais. O espaço extra entre as letras é gerado pelo fato de um Integer ocupar mais espaço que um Char.
Gostei + 0
03/02/2006
Delphi32
Exato.
Exatamente. O que já me explica o porquê de eu trocar uma string no arquivo do Word/Excel e o arquivo parar de funcionar. É como se eu estivesse trocando no arquivo o inteiro 65 pelo char ´A´, certo? E aí ele sabe que o arquivo foi modificado.
Mas aí é que eu não entendo porque no primeiro teste ao mudar o inteiro que está sendo gravado, a string não aparece se ela está sendo gravada da mesma maneira? Você tentou fazer o teste?
Outra coisa que reparei. No meu caso, estou rodando WinXp com suporte a idiomas do leste asiático, o que faz com que alguns caracteres apareçam às vezes como caracteres japoneses/chineses.
E Existe alguma maneira de garantir que a string seja gravada de forma a ser exibida, por exemplo no Bloco de Notas, com caracteres imcompreensíveis sem que eu tenha que criptografá-la? Como o Excel e o Word fazem isso?
Valeu pela resposta!
Até!
Gostei + 0
03/02/2006
Massuda
Gostei + 0
03/02/2006
Delphi32
Teoricamente, ao se criar um TTeste1 como eu fiz, eu não estou criando o meu próprio formato? Mas o resultado não é o mesmo... A minha grande dúvida seria justamente se o Word/Excel gravam esses dados. Se é em string, se antes de gravar a string é convertida em alguma coisa, etc. Só que acho que é algo que não se pode saber, afinal, o programa não é OpenSource...
De qualquer maneira, muito obrigado pelas respostas!
Até!
Gostei + 0
03/02/2006
Delphi32
Teoricamente, ao se criar um TTeste1 como eu fiz, eu não estou criando o meu próprio formato? Mas o resultado não é o mesmo... A minha grande dúvida seria justamente se o Word/Excel gravam esses dados. Se é em string, se antes de gravar a string é convertida em alguma coisa, etc. Só que acho que é algo que não se pode saber, afinal, o programa não é OpenSource...
De qualquer maneira, muito obrigado pelas respostas!
Até!
Gostei + 0
03/02/2006
Massuda
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)