2012-05-09 6 views
6

の配列を構築し、私はserver.Iに送信する必要があるバイトの配列を構築するためのMemoryStreamを使用していますTHRE質問があります。のMemoryStreamとバイト

1)の配列を構築するための良い方法はありますこれよりもバイトですか?

2)なぜこのコードが私のメモリストリームに偽を書き込むのですか?

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; 

デバッガを使用すると、ストリームに$ 3E6Cの代わりに$ 6F32という値が追加されています。

3)私は

MS.Position := 2; 

を呼び出すと、私は代わりに第三の流れの中で最初のバイトを得るのですか、なぜ、私はPBYTE(MS.Memoryが)^アクセスした場合は?

+3

特定の位置のバイトを読み取るには、位置を設定した後に 'MS.Read(SomeByte、1)'を使用します。 –

答えて

9

これよりもバイト配列を作成する方法はありますか?

私の考えでは、これは完全に合理的な方法です。


私は、ストリームに代わりに$ 3E6Cの値$ 6F32を追加されていることを参照してください。

もう一度確認してください。実際には正しい値が追加されています。しかし、リトルエンディアンのデータ型のトラップには注意してください。あなたのストリームに追加される4バイトは、$ 72、$ 72、$ 6C、$ 3Eです。


なぜ私の代わりに第三の流れの最初のバイトを得るのですか?

Memoryプロパティは常にストリームの先頭を参照するためです。ストリームの現在の位置は考慮されません。

+0

ありがとうございます。 – opc0de

+1

いつもPByteとしてポインタを取得してから、P:= Stream.Memory;を実行してください。 Inc(P、Stream.Position);正しいポインタを取得する –

関連する問題