2

我在将无符号整数存储在 C 中的字符数组中时遇到问题。我拥有的代码是

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 数组中,它将占用索引 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

您的分配会截断这些值,因为您只分配它们的最低字节。

你需要做这样的事情

*((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 回答
2

而你错了。您要做的是将 4 字节整数适合 1 字节dataArray[0]。此分配将通过在 MSB 端截断 3 个字节int来转换您的值。 您实际上(可能)尝试做的是:char

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

这会将 sysTime 中的所有 4 个字节复制到 dataArray 中的前四个字节。
这样,您将可以访问 sysTime 值的任何字节,但无法通过调用 dataArray[0] 来读取整数,因为它只会为您提供 1 个字节的原始值)。

如果你想读回你的值,你必须将地址转换char为地址U32

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

一步一步做什么:

  1. dataArray[0] -> dataArray的第一个元素>
  2. &dataArray[0] -> 获取 dataArray 的第一个元素的地址(char* - 指向 1 字节的指针)
  3. (U32 *)(&dataArray[0]) -> 转换char*U32 *(指向 1 字节的指针变为指向 4 字节的指针)
  4. *(U32 *)(&dataArray[0]) -> 上面的解引用结果(从给定地址读取四个字节)
于 2013-10-24T11:47:27.413 回答