GARANTIR DESCONTO

Fórum Dúvida sobre arquivos binários (TFileStream) #311556

03/02/2006

0

Pessoal, eu queria tentar entender o seguinte. Estava fazendo testes com gravação de arquivos binários. Criei o seguinte tipo:

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

Delphi32

Responder

Posts

03/02/2006

Massuda

Primeiro: não há nenhum tipo de criptografia envolvida.

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.


Responder

Gostei + 0

03/02/2006

Delphi32

Primeiro: não há nenhum tipo de criptografia envolvida.


Exato.

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.


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é!


Responder

Gostei + 0

03/02/2006

Massuda

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?
O valor zero costuma significar fim de string. Quando ele não está lá, provavelmente o bloco de Notas tenta interpretar o arquivo de outra forma.

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.
No caso do XP, os caracteres podem ocupar dois bytes (isso é chamado de caractere multi-byte ou unicode), de modo que o Bloco de Notas pode interpretar o arquivo de modo diferente (tenta ASCII ou tenta UNICODE).

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?
Não. Os caracteres são incompreensíveis por puro acaso.

Como o Excel e o Word fazem isso?
Os dados são armazenados num formato próprio desses programas que inclui controle sobre alterações no arquivo.


Responder

Gostei + 0

03/02/2006

Delphi32

OK. Só não entendi uma coisa.

Os dados são armazenados num formato próprio desses programas que inclui controle sobre alterações no arquivo.


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é!


Responder

Gostei + 0

03/02/2006

Delphi32

OK. Só não entendi uma coisa.

Os dados são armazenados num formato próprio desses programas que inclui controle sobre alterações no arquivo.


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é!


Responder

Gostei + 0

03/02/2006

Massuda

Teoricamente, ao se criar um TTeste1 como eu fiz, eu não estou criando o meu próprio formato?
Sim.
Mas o resultado não é o mesmo...
Como o formato é seu, você pode fazer qualquer operação adicional que julgar necessária antes de efetivamente gravar os dados no disco. Pode criptografar, compactar, adicionar dados inúteis, etc. Basta desfazer essas operações quando for ler de volta do disco.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar