2009-09-04 14 views

答えて

8

あなたはこのように、同じメモリ位置でのWord/SMALLINTを宣言することができます:

var 
    b : B02; 
    myInt: smallint absolute B02; 

その後、再び、あなただけのSMALLINTを作成して、その代わりのReadBufferにそれを通過しない理由は、特定の理由がありますアレイの?あなたが使っているクラスを正確にはわかりませんが、それはTStreamから読み込む方法とよく似ています。バイト数で表される変数と、すべての型の変数を受け入れます。なぜあなたが探している整数型としてあなたのバッファを宣言し、仲介者を切り捨てないのですか?

+2

+1私の心を読んでください。どちらの解決策でも、B02に文字データが含まれていない限り質問に答えます。 – skamradt

+0

右。とにかく整数を使用したくない場合です。 –

+1

ネットワーク上のデータがインテルのものではなく、ネットワークのバイトオーダーに格納されている可能性があります。 – gabr

4

データが "Intel"の順番(最下位バイトが先)ではなく、 "ネットワーク"の順番で(最上位バイトが先に)送信されている場合は、自分で何らかのバイトを行うことができます。

uses 
    SysUtils; 

var 
    b: B02; 
    w: word; //two bytes represent a word, not an integer 

socket.ReadBuffer(b, 2); 
WordRec(w).Hi := b[1]; 
WordRec(w).Lo := b[2]; 

Mghieはコメントで、次のアプローチを示唆した(と私は彼に同意):

uses Winsock; 

var 
    w: word; 

socket.ReadBuffer(w, 2); 
w := ntohs(w); 
+2

+1しかし、私はまだプロセッサがリトルエンディアンであるという暗黙の前提を好まない。コードは単語を読み込み、 'ntohs()'を呼び出して 'SmallInt'にキャストしなければなりません。 – mghie

+1

@mghie:あなたはまったく正しいです。しかし、私はまだそれをインテルだけの方法で書いています。このうさぎは壊れにくいです:( – gabr

3

あなたはそれをキャストすることができます:

var 
    a: array[01..02] of Byte; 
    i: Integer; 
begin 
    i := PWORD(@a)^; 
end; 

か、バイト順序を変更する必要がある場合を:

i := Swap(PWORD(@a)^); 
関連する問題