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]
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
Curtir tópico
+ 0
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;
Responder
Gostei + 0
13/01/2005
Wbb
É isso aí Massuda! Funcionou.
Obrigado novamente pela atenção, que aliás, foi extramente útil.
t+
wbb
Obrigado novamente pela atenção, que aliás, foi extramente útil.
t+
wbb
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)