GARANTIR DESCONTO

Fórum Conversão de bytes para tipos como Integer, String, etc #265195

13/01/2005

0

Pessoal, outrto dia precisei de um método para fazer a conversão de valores inteiros, string, etc, para bytes e então grava-los num arquivo stream. Consegui aqui mesmo no forum a rotina de conversão e gravação apresentada abaixo e adaptei às minhas necessidades.

Agora porém, preciso ler o mesmo arquivo que criei antes. Claro que é nececssário saber como estão dispostos os bytes dedntro do arquivo. Entã como exemplo posso dizer que em um dos casos existem as seguintes informações gravadas na sequência:

Um número inteiro do tipo Integer;
Uma string de 8 caracteres

Portanto, convertendo estas informações em bytes tem-se:
[color=red:ce99932d2d]1234[/color:ce99932d2d][color=blue:ce99932d2d]N12345568[/color:ce99932d2d]

Ou seja:
[color=red:ce99932d2d]1234[/color:ce99932d2d] = 4 bytes de um numero do tipo inteiro.
[color=blue:ce99932d2d]N12345678[/color:ce99932d2d] = 1 byte representado por ´N´ que determina o comprimento da strring + 8 bytes de uma strting de 8 caracteres

[b:ce99932d2d]O que eu preciso:[/b:ce99932d2d]
Preciso pegar estas informações no formato [color=red:ce99932d2d]1234[/color:ce99932d2d][color=blue:ce99932d2d]N12345568[/color:ce99932d2d] e converter novamente para seus respectivos tipos, ou seja:
Converter [color=red:ce99932d2d]1234[/color:ce99932d2d] em Número inteiro
Converter [color=blue:ce99932d2d]N12345568[/color:ce99932d2d] em uma string de 8 caracteres.

Alguém sabe como fazer este processo?

wbb



[color=red:ce99932d2d][b:ce99932d2d]Conversão de [u:ce99932d2d]tipos para bytes[/u:ce99932d2d]:[/b:ce99932d2d][/color:ce99932d2d]
var 
  X: Integer; 
  Y: Double; 
  S: string; 

procedure Gravar(NomeDoArquivo: string); 
var 
  Stream: TFileStream; 
  N: Integer; 
begin 
  Stream := TFileStream.Create(NomeDoArquivo, fmCreate); 
  
  Stream.Write(X, SizeOf(X)); 
  Stream.Write(Y, SizeOf(Y)); 

  // string é mais complicado... 
  N := Length(S); 
  Stream.Write(N, SizeOf(N)); // tamanho 
  if N > 0 then Stream.Write(S[1], N); // texto 

  Stream.Free; 
end; 

procedure Ler(NomeDoArquivo: string); 
var 
  Stream: TFileStream; 
  N: Integer; 
begin 
  Stream := TFileStream.Create(NomeDoArquivo, fmOpenRead); 
  
  // le na mesma ordem que escreveu 
  Stream.Read(X, SizeOf(X)); 
  Stream.Read(Y, SizeOf(Y)); 

  // string é mais complicado... 
  Stream.Read(N, SizeOf(N)); 
  if N > 0 then begin 
    SetLength(S, N); 
    Stream.Read(S[1], N); 
  end 
  else begin 
    S := ´´; 
  end; 

  Stream.Free; 
end; 



Wbb

Wbb

Responder

Posts

13/01/2005

Massuda

procedure Ler(NomeDoArquivo: string); 
var 
  Stream: TFileStream; 
  N: Byte; // <-- mudou aqui!
begin 
  Stream := TFileStream.Create(NomeDoArquivo, fmOpenRead); 
  
  // le na mesma ordem que escreveu 
  Stream.Read(X, SizeOf(X)); 
  Stream.Read(Y, SizeOf(Y)); 

  // string: 1 byte para o tamanho + os caracteres
  Stream.Read(N, SizeOf(N)); 
  if N > 0 then begin 
    SetLength(S, N); 
    Stream.Read(S[1], N); 
  end 
  else begin 
    S := ´´; 
  end; 

  Stream.Free; 
end; 
Assume que se for uma string vazia, grava ZERO (para indicar zero caracteres) e mais nada.


Responder

Gostei + 0

13/01/2005

Wbb

É isso aí Massuda! Funcionou.
Obrigado novamente pela atenção, que aliás, foi extramente útil.

t+
wbb


Responder

Gostei + 0

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

Aceitar