2012-05-09 9 views
6

estoy usando un MemoryStream para construir una matriz de bytes que necesito para enviar a un server.I tienen thre preguntas:MemoryStream y la construcción de una matriz de bytes

1) ¿Hay una mejor manera de construir una serie de bytes que esto?

2) ¿Por qué esta porción de código escribe falso en mi flujo de 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; 

Usando el depurador veo que en la corriente se agrega el valor $ 6F32 en lugar de $ 3E6C.

3) Si llamo

MS.Position := 2; 

y luego tengo acceso PBYTE (MS.Memory)^¿Por qué aparece el primer byte en el flujo en lugar de la tercera?

+3

Para leer un byte en una posición específica, use 'MS.Read (SomeByte, 1)' después de establecer la posición. –

Respuesta

9

¿Hay una mejor manera de construir una matriz de bytes que esta?

Esa es una manera perfectamente razonable de hacerlo, desde mi punto de vista.


veo que en la corriente se agrega el valor $ 6F32 en lugar de $ 3E6C.

Comprueba nuevamente. Los valores correctos son, de hecho, agregados. Pero ten cuidado con las trampas de los tipos de datos little endian. Los 4 bytes agregados a su flujo, en orden, son: $ 72, $ 72, $ 6C, $ 3E.


¿Por qué aparece el primer byte en el flujo en lugar de la tercera?

Porque la propiedad Memory siempre hace referencia al comienzo de la secuencia. No tiene en cuenta la posición actual de la secuencia.

+0

Muchas gracias por aclarar las cosas – opc0de

+1

Siempre puede obtener el puntero como un PByte y luego hacer P: = Stream.Memory; Inc (P, Stream.Position); para obtener el puntero correcto –

Cuestiones relacionadas