0

type の大きな配列がありuint8_t (uint8_t mydata[1000])ます。この大きな配列から 4 バイト長のデータをコピーしたいだけです。4 バイトのデータを 64 ビット整数変数にコピーしても問題ありませんか? または、宛先変数を 4 バイト長として定義する必要がありますuint32_tか?

uint8_t mydata[1000];

uint64_t mysentS; //Is this okay when coping 4 bytes of data or should it be uint32_t?
uint64_t mysentUS;

memcpy(&mysentS, &mydata[16], 4);
memcpy(&mysentUS, &mydata[20], 4);
4

2 に答える 2

1

「クラッシュしない」でいいのですが、かなり怖いコードです。

char文字配列内の位置に、整数として使用したい4 秒の 32 ビット整数が含まれていると仮定すると、エンディアンの問題に対処する必要があります。

の「最初の」(アドレス単位の)バイトにコピーするuint64_tと、現在のマシンのエンディアンに依存する必要な値が得られるかどうかは明らかではありません。

リトルエンディアンのマシンでは動作しますが、ビッグエンディアンのマシンでは動作しません。

バイトごとに値を抽出する方が良いです。そうすれば、各バイトが何を意味するかを明示できるからです。

/* Extract 32-bit little-endian value. */
mysentS = (mydata[16] << 0)  + (mydata[17] << 8) +
          (mydata[18] << 16) + (mydata[19] << 24);

unsigned intこれは、シフトが適用される前にシフト式の左辺が昇格されるため機能します。

于 2013-07-08T12:16:42.073 に答える