0

この問題があります。長さを動的に変更するペイロードがあります。このペイロードをカットしないと、私にとってゴミのような情報もあるでしょう。したがって、ペイロードの長さに基づいてペイロードをカットしたいと思います。

私はコードのこの部分を持っています:

uint64_t data_tmp = HTONLL((uint64_t) zp->data);
uint8_t len = zp->length;
uint64_t mask = 0xFFFF >> (64 - len);
data_tmp = data_tmp & mask;
printf("DATA_TMP = %llu\n", data_tmp);

zp->data は t->payload フィールドに書き込まれた後です。これが私のペイロードです。これは 64 ビット フィールドです。

このペイロードを一時的に受け取りたい。uint8 型のペイロード長 (zp->length フィールド) を計算します。64バイトをシフトするマスクを作成した後-payload_lengthを一時ペイロードに適用し、必要なデータのみとすべてゼロのフィールドを取得できるようにします。

これどうやってするの?

例えば。payload_length が 01 でペイロードが 00+..............(ゴミ) 64 バイトで 00000000 のようなペイロードを取得したい場合。

私のpayload_lengthが13で、ペイロードが1284732089322309の場合....13バイトだけ取得したい。

言いづらかったらすいません…

4

2 に答える 2

1

あなたの質問を正しく理解できたかどうかわかりませんが、バイナリ AND の代わりに論理 AND を使用しています。

式「変数 && 変数」は 1 または 0 に評価されます

式「変数 & 変数」はバイナリ AND に評価され、適切なマスクを使用すると、おそらく意図したとおりにデータがトリミングされます

于 2013-03-08T14:46:44.353 に答える
0

あなたはこれを必要とします:

uint64_t mask = (1uLL << (len * 4)) - 1;
data_tmp = data_tmp & mask;

これにより、4ビットの数字の最下位が得られます。 len代わりに最高が必要な場合はdata_tmp、マスクを適用する前に回転できます。

data_tmp >>= (64 - len * 4)
于 2013-03-08T14:53:07.667 に答える