1

int を宣言し、c に値を割り当てました。記憶では以下のようです

アドレス 0x20002AD4 で 0x78 0x01 0x00 0x00

int の 1 番目と 2 番目のバイトから値を抽出する必要があります。次のコードで最初のバイトを正常に抽出しました (パケット [2] を参照)。

int dataSize = (lightCount * 3) + 1;
unsigned char packet[totalSize];

packet[0] = 0x7E;
packet[1] = 0x06;
packet[2] = (unsigned char)*(&dataSize); //dataSize LSB - THIS WORKS
packet[3] = (unsigned char)*(&dataSize + 1); //dataSize MSB - THIS DOES NOT

ただし、ポインター演算を使用して int の 2 番目のバイトの値を返そうとすると (packet[3] を参照)、代わりに 4 番目のバイトが返されます。これは、intのサイズが4バイトであるため、アドレスの+1が4バイト移動するためだと思います。

2番目のバイトで値を返す方法を誰かが提案できますか、つまり上記の例では 0x01 を返したいです

4

2 に答える 2

1

int を配列として扱うのではなく、 char配列の要素をアドレス指定する必要があります。

unsigned char const * p = (unsigned char const *)&dataSize;

packet[2] = p[0];
packet[3] = p[1];
于 2013-10-20T17:04:01.293 に答える
1

以下は、指定されたコードの完全なサンプル プログラムです (バイトの 2 番目の部分を取得するように変更されています)。

#include <stdio.h>

int main() {
    int dataSize = 0x7E06;
    unsigned char packet[4];

    packet[0] = 0x7E;
    packet[1] = 0x06;
    packet[2] = (unsigned char)dataSize;
    packet[3] = *(((unsigned char*)&dataSize) + 1);

    printf("%d, %d, %d, %d\n", packet[0], packet[1], packet[2], packet[3]);
}

私のコンピューターでは、これは出力されます126, 6, 6, 126。他のアーキテクチャでは、バイトが逆になる場合があります。

于 2013-10-20T17:06:05.277 に答える