1

バックグラウンド

単純な BOOTP/DHCP サーバーを作成していますが、一部のパケット バイト (特に、DHCP オプション 13、FileSize) の作成に苦労しています。

仕様では、オプションの合計長は 64 バイト => ID (13) に 1 バイト、データ長に 1 バイト、残りのバイトはデータ OR 0 であると記載されています。

問題

データとして int 値 14236 を表現する必要があります。これは 16 進数で 379C に相当しますが、これは 2 バイトのデータに分散する必要があります。int を取得してデータの char[] を取得するにはどうすればよいですか?

4

4 に答える 4

4

ネットワークバイトオーダーである必要があります。その場合は、を使用できますhtons。次の2バイトで必要な場合:

char buffer[4];
buffer[0] = 13;   // code
buffer[1] = 2;    // length
*(uint16_t*)(buffer + 2) = htons( 14236 );
于 2011-12-08T15:30:51.250 に答える
3

次のコードを使用できます。

int size;
assert(size < 0x10000);

unsigned char twoBytes[];
twoBytes[0] = size & 0xFF;
twoBytes[1] = size >> 8;
于 2011-12-08T15:30:49.520 に答える
1
int size = 14236;
unsigned char bytes[2] = { (size >> 8) & 0xff, size & 0xff };

printf("%x%x", bytes[0], bytes[1]);

注意: 2バイトがネットワーク順に配列に配置されていることを確認する必要があります。これは、私が間違っていない場合はビッグエンディアンです。

于 2011-12-08T15:29:07.367 に答える
0

だから、あなたはパケットを持っています:

unsigned char optionBytes[64];

次に、IDとデータの長さを設定します。

optionBytes[0] = 13;
optionBytes[1] = 2;

そして最後に、値の上位バイトと下位バイトを計算します。

optionBytes[2] = 14236 / 256;
optionBytes[3] = 14236 % 256;

これは、データを「ビッグエンディアン」形式で表現し、オフセットの値を低くすると価値が高くなることを前提としています。

于 2011-12-08T15:33:34.477 に答える