Arquivos tipados em pascal
Essa é para os que gostam de escovar bits...
Ola Pessoal, estou precisando da ajuda de voces para resolver um problema ou saber se pode ser resolvido.
Na empresa em que trabalho tem um sistema que foi desenvolvido em pascal e os arquivos utilizados para armazenar os dados sao arquivos tipados (recrord), pra quem não sabe para que eu possa ler as informações neste tipo de arquivo eu preciso saber exatamente a estrutura em que o arquivo foi montado, NOME C 30, IDADE N 2, etc, etc..
Este é o problema, nao tem fontes e nem documentacao, estou tentando ler de todo jeito, byte a byte, linha inteira, e varias formas, mas nao consigu nenhum resultado.
Minha Pergunta:
O que estou tentando fazer é possivel ??? Existe alguma forma de eu ler tais arquivos sem saber a estrutura original ???
Obrigado aqueles que puderem me ajudar e contem com mais um membro pra ajudar voces no que eu puder.
Astalavista baby !
Ola Pessoal, estou precisando da ajuda de voces para resolver um problema ou saber se pode ser resolvido.
Na empresa em que trabalho tem um sistema que foi desenvolvido em pascal e os arquivos utilizados para armazenar os dados sao arquivos tipados (recrord), pra quem não sabe para que eu possa ler as informações neste tipo de arquivo eu preciso saber exatamente a estrutura em que o arquivo foi montado, NOME C 30, IDADE N 2, etc, etc..
Este é o problema, nao tem fontes e nem documentacao, estou tentando ler de todo jeito, byte a byte, linha inteira, e varias formas, mas nao consigu nenhum resultado.
Minha Pergunta:
O que estou tentando fazer é possivel ??? Existe alguma forma de eu ler tais arquivos sem saber a estrutura original ???
Obrigado aqueles que puderem me ajudar e contem com mais um membro pra ajudar voces no que eu puder.
Astalavista baby !
Magicbyte
Curtidas 0
Respostas
Beppe
14/01/2004
Que informações você já sabe? Quantos arquivos assim você tem?
Não é trivial descobrir o formato do arquivo, mas com um pouco de sorte, e se o formato dos registros for amigável, é possível fazer isso.
Não é trivial descobrir o formato do arquivo, mas com um pouco de sorte, e se o formato dos registros for amigável, é possível fazer isso.
GOSTEI 0
Renatosilva
14/01/2004
Acredito que é possível, só teríamos que saber a estrutura em disco de um arquivo tipado, o que eu não sei, mas acredito que se possa achar. Então você descobriria a quantidade e os tipos de campos podendo assim criar um record apropriado para manipulá-lo. Cara o Delphi é tão sinistro que de repente tem alguma coisa na VCL/RTL escondida que possa te ajudar.
GOSTEI 0
Beppe
14/01/2004
Cara o Delphi é tão sinistro que de repente tem alguma coisa na VCL/RTL escondida que possa te ajudar.
O Delphi é bem sinistro mesmo(palavra de quem já leu toda a System.pas), mas os arquivos old-school(file of) não conhecem sua própria estrutura.
GOSTEI 0
Magicbyte
14/01/2004
Pois é Beppe, vc tem razao, ninguem sabe a estrutura original dos arquivos, pelo q estou estudando do assunto este tipo de arquivo nao é como um DBF (clipper) que tem a sua estrutura definida em um header embutido no proprio arquivo.
Bom eu tenho 78 arquivos deste tipo, é um sistema de Departamento pessoal, os dados Numericos sei q será quase impossivel decifrar, mas os campos string acho q tenho chances. Tenho o sistema e ja tentei montar um registro no formato do cadastro, por exemplo cadastro de empresas: codigo, nome, atividade, telefone - montei um record com estas informacoes e utilizando a quantidade de digitos que estes campos suportam, usando o tipo ´String´, mas naum consegui, pois vem com sujeira ou incompleto.
Tambem tentei simular a gravacao de um registro e comparar fazendo a leitura em uma estrutura diferente, ou seja, criei um registro codigo str 5, nome str 40, atividade str 20 e fiz a leitura usando tipos ou tamanhos diferentes pra tentar avaliar o resultado e chegar a uma conclusao, mas tb nao deu certo.
Tentei ler byte a byte do arquivo usando assign,reset,read e usando um array of byte, tb nao deu certo, pois ele tras sujeira novamente.
Estou colhendo dados agora pra tentar entender como o arquivo é gravado no HD e tentar deduzir como posso extrair os dados, pois sabendo como as coisas funcionam será mais facil chegar a uma conclusao.
Nao pensem que é esquisitice minha saber tais coisas, mas fui contratado para fazer este trabalho, ou seja, meu emprego depende disso.
A proposito, mesmo q nao saibam como extrair os dados, se puderem me ajudar com informacoes ou sites falando sobre estrutura de arquivos e armazenamento eu ja agradeço, e com certeza qdo eu tiver a solucao vou publica-la aki.
Forte Abraço,
MB
Bom eu tenho 78 arquivos deste tipo, é um sistema de Departamento pessoal, os dados Numericos sei q será quase impossivel decifrar, mas os campos string acho q tenho chances. Tenho o sistema e ja tentei montar um registro no formato do cadastro, por exemplo cadastro de empresas: codigo, nome, atividade, telefone - montei um record com estas informacoes e utilizando a quantidade de digitos que estes campos suportam, usando o tipo ´String´, mas naum consegui, pois vem com sujeira ou incompleto.
Tambem tentei simular a gravacao de um registro e comparar fazendo a leitura em uma estrutura diferente, ou seja, criei um registro codigo str 5, nome str 40, atividade str 20 e fiz a leitura usando tipos ou tamanhos diferentes pra tentar avaliar o resultado e chegar a uma conclusao, mas tb nao deu certo.
Tentei ler byte a byte do arquivo usando assign,reset,read e usando um array of byte, tb nao deu certo, pois ele tras sujeira novamente.
Estou colhendo dados agora pra tentar entender como o arquivo é gravado no HD e tentar deduzir como posso extrair os dados, pois sabendo como as coisas funcionam será mais facil chegar a uma conclusao.
Nao pensem que é esquisitice minha saber tais coisas, mas fui contratado para fazer este trabalho, ou seja, meu emprego depende disso.
A proposito, mesmo q nao saibam como extrair os dados, se puderem me ajudar com informacoes ou sites falando sobre estrutura de arquivos e armazenamento eu ja agradeço, e com certeza qdo eu tiver a solucao vou publica-la aki.
Forte Abraço,
MB
GOSTEI 0
Beppe
14/01/2004
Primeiro você descobre o tamanho de cada registro, que é fixo. Seria um divisor comum dos tamanhos dos arquivos. Por exemplo, se você tem um arquivo de 6 bytes e um de 4, então o registro é 1 ou 2 bytes.
Um editor hex também vai ajudar.
Um editor hex também vai ajudar.
GOSTEI 0
Renatosilva
14/01/2004
mas os arquivos [color=red:ac77b92ed9]old-school[/color:ac77b92ed9]([color=red:ac77b92ed9]file of[/color:ac77b92ed9]) não conhecem sua própria estrutura.
Cara, boiei... Do que você está falando?
Pois é Beppe e magicbyte, o que temos que descobrir é como os registros são armazenados no HD. Acho que em algum lugar do mundo existe uma descrição do arquivo, o difícil é achar (quem sabe com a própria Borland).
magicbyte, uma idéia é mapear os caracteres de controle pelo código ASCII, assim poderíamos conseguir talvez descobrir os separadores de campo e de registro. Vou ver se arrumo um tempinho pra estudar isso...
GOSTEI 0
Renatosilva
14/01/2004
magicbyte, me manda os arquivos (renato3110@yahoo.com.br)
GOSTEI 0
Andersonc
14/01/2004
Cara, achei isto no no site http://www.delphibasics.co.uk
veja se ajuda...
Reading and writing to pure binary files
Pure binary files are a bit peculiar. You must use BlockRead and BlockWrite instead of Read and Write. These have the added benefit of greater performance than the Read and Write, but are really geared at writing just blocks of binary data.
Here is an example :
var
myFile : File;
byteArray : array[1..8] of byte;
oneByte : byte;
i, count : Integer;
begin
// Try to open the Test.byt file for writing to
AssignFile(myFile, ´Test.byt´);
ReWrite(myFile, 4); // Define a single ´record´ as 4 bytes
// Fill out the data array
for i := 1 to 8 do
byteArray[i] := i;
// Write the data array to the file
BlockWrite(myFile, byteArray, 2); // Write 2 ´records´ of 4 bytes
// Fill out the data array with different data
for i := 1 to 4 do
byteArray[i] := i*i; // Value : 1, 4, 9, 16
// Write only the first 4 items from the data array to the file
BlockWrite(myFile, byteArray, 1); // Write 1 record of 4 bytes
// Close the file
CloseFile(myFile);
// Reopen the file for reading only
FileMode := fmOpenRead;
Reset(myFile, 1); // Now we define one record as 1 byte
// Display the file contents
// Start with a read of the first 6 bytes. ´count´ is set to the
// actual number read
ShowMessage(´Reading first set of bytes :´);
BlockRead(myFile, byteArray, 6, count);
// Display the byte values read
for i := 1 to count do
ShowMessage(IntToStr(byteArray[i]));
// Now read one byte at a time to the end of the file
ShowMessage(´Reading remaining bytes :´);
while not Eof(myFile) do
begin
BlockRead(myFile, oneByte, 1); // Read and display one byte at a time
ShowMessage(IntToStr(oneByte));
end;
// Close the file for the last time
CloseFile(myFile);
end;
veja se ajuda...
Reading and writing to pure binary files
Pure binary files are a bit peculiar. You must use BlockRead and BlockWrite instead of Read and Write. These have the added benefit of greater performance than the Read and Write, but are really geared at writing just blocks of binary data.
Here is an example :
var
myFile : File;
byteArray : array[1..8] of byte;
oneByte : byte;
i, count : Integer;
begin
// Try to open the Test.byt file for writing to
AssignFile(myFile, ´Test.byt´);
ReWrite(myFile, 4); // Define a single ´record´ as 4 bytes
// Fill out the data array
for i := 1 to 8 do
byteArray[i] := i;
// Write the data array to the file
BlockWrite(myFile, byteArray, 2); // Write 2 ´records´ of 4 bytes
// Fill out the data array with different data
for i := 1 to 4 do
byteArray[i] := i*i; // Value : 1, 4, 9, 16
// Write only the first 4 items from the data array to the file
BlockWrite(myFile, byteArray, 1); // Write 1 record of 4 bytes
// Close the file
CloseFile(myFile);
// Reopen the file for reading only
FileMode := fmOpenRead;
Reset(myFile, 1); // Now we define one record as 1 byte
// Display the file contents
// Start with a read of the first 6 bytes. ´count´ is set to the
// actual number read
ShowMessage(´Reading first set of bytes :´);
BlockRead(myFile, byteArray, 6, count);
// Display the byte values read
for i := 1 to count do
ShowMessage(IntToStr(byteArray[i]));
// Now read one byte at a time to the end of the file
ShowMessage(´Reading remaining bytes :´);
while not Eof(myFile) do
begin
BlockRead(myFile, oneByte, 1); // Read and display one byte at a time
ShowMessage(IntToStr(oneByte));
end;
// Close the file for the last time
CloseFile(myFile);
end;
GOSTEI 0