2

Cの文字配列にunsigned intを格納する際に問題があります。私が持っているコードは

static unsigned char dataArray[8];


// values before are 2400 and 2100
// array layout: 0 0 0 0 0 0 0 0

U32 sysTime1 = 2400;
U32 sysTime2 = 2100;

dataArray[0] = sysTime1;
dataArray[4] = sysTime2;

// values after are 96 and 52
// array layout: 96 0 0 0 52 0 0 0

正しい値を配列に格納するにはどうすればよいですか? インデックス 0 から char 配列に 4 バイトのデータ型を格納すると、インデックス 0 から 3 までのスペースが必要になると思いました。どんな助けでも大歓迎です。U32 は符号なし 32 ビット (4 バイト) 整数です。

4

3 に答える 3

3
union u
{
    unsigned char dataArray[8];
    U32 sysTime[2];
}

u s;
s.sysTime[0]=2400;
s.sysTime[0]=1200;
于 2013-10-24T11:45:38.020 に答える
2

そして、あなたは間違っていました。あなたがやろうとしているのは、4 バイト整数を 1 バイトに合わせることですdataArray[0]。この割り当ては、MSB 側で 3 バイトを切り捨てることによって、int値を に変換します。 あなたが実際に(おそらく)やろうとしていたことは次のとおりです。char

memcpy(&dataArray[0], &sysTime1, sizeof(U32));

これにより、sysTime の 4 バイトすべてが dataArray の最初の 4 バイトにコピーされます。
この方法では、sysTime 値の任意のバイトにアクセスできますが、元の値の 1 バイトしか得られないため、dataArray[0] を呼び出して整数を読み戻すことはできません)。

値を読み返したい場合は、 のアドレスを のアドレスに変換する必要がありcharますU32

*((U32*)(&dataArray[0]))

ステップごとに何をしますか:

  1. dataArray[0] -> dataArray の最初の要素>
  2. &dataArray[0] -> dataArray の最初の要素のアドレスを取得 (char* - 1 バイトへのポインター)
  3. (U32 *)(&dataArray[0]) -> 変換(1 バイトchar*U32 *のポインターが 4 バイトへのポインターになる)
  4. *(U32 *)(&dataArray[0]) -> 上記の逆参照結果 (指定されたアドレスから 4 バイトを読み取る)
于 2013-10-24T11:47:27.413 に答える
2

値の最下位バイトのみを割り当てるため、割り当てによって値が切り捨てられます。

あなたはこのようなことをする必要があります

*((U32 *) &dataArray[0]) = sysTime1;
*((U32 *) &dataArray[4]) = sysTime2;

または例を使用しますmemcpy

memcpy(&dataArray[0], &sysTime1, sizeof(sysTime1));
memcpy(&dataArray[4], &sysTime2, sizeof(sysTime2));

もちろん、値の各バイトを取得して割り当てることもできます。

dataArray[0] = (sysTime1 >> 24) & 0xff;
dataArray[1] = (sysTime1 >> 16) & 0xff;
dataArray[2] = (sysTime1 >>  8) & 0xff;
dataArray[3] =  sysTime1        & 0xff;

(そして他の人も同じです。)

于 2013-10-24T11:42:37.307 に答える