2012-05-09 20 views
6

Sto usando un MemoryStream per costruire un array di byte ho bisogno di inviare a un server.I hanno Thre domande:MemoryStream e la costruzione di un array di byte

1) C'è un modo migliore per costruire una serie di byte di questo?

2) Perché questo pice di codice scrive fasulli nel mio flusso di memoria?

var 
    serial : word; 
    MS : TMemoryStream; 
const 
    somebytes : array [0..1] of byte = ($72,$72); 
... 
begin 
     MS := TMemoryStream.Create(); 
     try 
     MS.Write(somebytes[0],2); 
     serial := $3E6C; 
     MS.Write(serial,2); 
     finally 
     MS.Free; 
end; 

utilizzando il debugger vedo che nel flusso si aggiunge il valore di $ 6F32 invece di $ 3E6C.

3) se chiamo

MS.Position := 2; 

e quindi accedo PBYTE (MS.Memory)^perché ottengo il primo byte nel flusso invece del terzo?

+3

Per leggere un byte in una posizione specifica, utilizzare 'MS.Read (SomeByte, 1)' dopo aver impostato la posizione. –

risposta

9

C'è un modo migliore per costruire una matrice di byte di questo?

Questo è un modo perfettamente ragionevole per farlo, a mio avviso.


vedo che nel flusso si aggiunge il valore di $ 6F32 invece di $ 3E6C.

Verificare di nuovo. I valori corretti sono infatti aggiunti. Ma attenzione alle trappole dei tipi di dati little endian. I 4 byte aggiunti al tuo stream, in ordine, sono: $ 72, $ 72, $ 6C, $ 3E.


Perché ho la primo byte nel flusso invece del terzo?

Poiché la proprietà Memory si riferisce sempre all'inizio del flusso. Non tiene conto della posizione corrente del flusso.

+0

Grazie infinite per aver chiarito il problema – opc0de

+1

È sempre possibile ottenere il puntatore come un PByte e quindi eseguire P: = Stream.Memory; Inc (P, Stream.Position); per ottenere il puntatore corretto –

Problemi correlati