Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

douglasdepaula

Ler MemoryStream

Recommended Posts

Galera to precisando de uma ajuda aki....

é o seguinte, eu carrego um arquivo para uma MemoryStream.. até ai beleza..

mas eu preciso de uma funcao que pegue o Hexadecimal do arquivo q está na memorystream..

alguem da um help aew..

vlws..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, é simples. Basta pegar cada byte do stream e converter para hexadecimal.

 

Utilize a função IntToHex do Delphi

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente isto e veja se funciona

procedure TForm1.FormCreate(Sender: TObject);
var
	memoria : TMemoryStream;
	buffer: array [1 .. 1] of byte;
	bt_hex: String[2];
begin
	memoria.Read(buffer, 1);
	bt_hex := IntToHex(buffer[1], 2);
	showmessage(bt_hex);

end;

para ler um byte especifico, basta dar um seek no TMemoryStream

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok, funcionou XD

so q so deu certo c eu carregar o memorystream de um arquivo.. mas eu gravo no memorystream pelo

"Stream.Write"

ai quando vai ler o stream so da um monte de "000000000"

T_T

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum. Você esta dando um seek na posição que você quer ler. Um TMemoryStream é como um arquivo: existe um ponteiro que indica qual é o byte em que a leitura está.

 

Exemplo

 

se você cria um TMemoryStream, e manda escrever 5 bytes, a posição de leitura vai para o caractere (byte) 5. Para você ler estes 5 caracteres é necessário que se utilize a função

TMemoryStream.Seek(0, 0) //TMemoryStream.Seek(inicio, offset);

Compartilhar este post


Link para o post
Compartilhar em outros sites

ainda estou com problemas aki, agora está lendo, mais errado olha

 

eu gravo esse hexadecimal no stream

"E7 4B 00 00 00 00 E3 FF FC D3 39 F1 F3 2C"

so que quando vai ler olha como retorna

"E7 4B 00 E3 39 39 39 39 39 39 39 39 39 39"

 

comeca a copiar certo, mais corta varios 00, e tbm corta o FF FC D3, ai pula pro 39, e corta o F1 F3 2C

oq está errado ?

  Stream.Seek(0, 0);

  for I := 1 to Stream.Size do
  begin
    Stream.Read(Buffer, I);
    Hex := IntToHex(Buffer[1], 2);
    Result:= Result + Hex;
  end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual é o tamanho do Buffer que você esta utilizando? 1 caractere (arrray [1 .. 1] fo byte) como no exemplo anterior ou mais?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ja testei

Buffer: array [1..1] of byte

Buffer: array [1..2048] of byte

e tbm

Buffer: array of byte

depois usei setlenth(buffer, stream.size)

nenhum deu certo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz um teste aqui e funcinou.

 

Veja:

procedure TForm1.FormCreate(Sender: TObject);
var
	teste : TMemoryStream;
	buffer: array [1 .. 1] of byte;

	str : string;
begin
	 teste := TMemoryStream.Create;
 	buffer[1] := ord('a');teste.Write(buffer, 1);
 	buffer[1] := ord('b');teste.Write(buffer, 1);
 	buffer[1] := ord('c');teste.Write(buffer, 1);
 	buffer[1] := ord('d');teste.Write(buffer, 1);
 	buffer[1] := ord('e');teste.Write(buffer, 1);
 	buffer[1] := ord('f');teste.Write(buffer, 1);
 	buffer[1] := ord('g');teste.Write(buffer, 1);

 	teste.Seek(0, 0);
 	teste.Read(buffer, 1); str := char(buffer[1]);
 	teste.Read(buffer, 1); str := str + char(buffer[1]);
 	teste.Read(buffer, 1); str := str + char(buffer[1]);
 	teste.Read(buffer, 1); str := str + char(buffer[1]);
 	teste.Read(buffer, 1); str := str + char(buffer[1]);
 	teste.Read(buffer, 1); str := str + char(buffer[1]);
 	teste.Read(buffer, 1); str := str + char(buffer[1]);

 	showmessage(str);


end;

Acho que o problema esta na su conversão com hexadecimais. Precisa utilizar a tabela ascii e comprar para ver se o seu programa esta convertentendo para/de hexadecimal corretamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade, no meu exemplo, não estou explicando como pegar o texto. É só um exemplo, na verdade a string que usei é so para mostrar como os valores estão corretos. O que eu quis mostrar ai é como adicionar bytes no TMemoryStream e recuperá-los depois.

 

Nota: Ord('a') retorna o código (byte) que representa o caractere 'a'.

 

Para "pegar o hex" (converter o byte para hexadecimal) ao envés de pega os dados desta maneira

str := str + char(buffer[1]);

você pegaria assim

str := str + IntToHex(buffer[1], 2);

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas o problema é que o conteudo desse stream vai ser variavel..

vai sempre mudar.. eu teria q usar assim

 

Stream.Seek(0, 0);
   for I := 1 to Stream.size do
   begin
     Stream.Read(buffer, 1);
     str := str + IntToHex(buffer[1], 2);
   end;
   showmessage(str);

mas assim nao esta funcionando

c eu gravo o valor

64 6F 75 67 6C 61 73

quando uso esse exemplo acima.. retorna:

64 00 6F 00 75 00 67

pq pega o valor errado assim ?

 

ps: se eu carregar o stream pelo

LoadFromFile('arquivo.txt');

le certinho

 

mas loadfromfile nao daria certo aki.. pq o conteudo do stream seria um buffer recebido de socket...

Compartilhar este post


Link para o post
Compartilhar em outros sites

consegui resolver isso.. so mais uma duvida

e tpw eu tenho uma string variavel com um hexadecimal ex:

Str := 'FF0E003001';

como eu gravo essa string no stream como hex ? pq c colocar

Stream.Write(Str, Length(Str));

vai gravar como texto.. preciso q grave essa string como hexadecimal no stream..

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.