如何一次访问数组的多个元素?

时间:2014-10-12 21:23:23

标签: c arrays

我有一个数组uint8_t data [256]。但每个元素都是单字节。 我的数据总线长32位。所以,如果我想访问32位,我会这样做:

DATA = data [i] +(data [i + 1]<<#8)+(data [i + 2]<<<<<<<<<<<<<<<<<<<< );

但是这会在每个1字节的内存中转换为4个单独的读取请求。

如何以1个事务的形式访问所有4个字节?

4 个答案:

答案 0 :(得分:1)

如果您知道数据的字节序(或者如果您不关心),并且您的数据已对齐(或具有字节寻址过程且您不关心效率),则可以将数据转换为a uint32_t *并以4字节的卡盘访问它,如下所示:

DATA = ((uint32_t *)data)[i/4];

这当然假设i是4的倍数。

答案 1 :(得分:1)

只需将data投射到uint32_t

uint8_t data[256] = {1,2,3,4,5,6,7,8} ;

int main(int argc, char **argv)
{
  int index = 1 ;
  uint32_t d = *(uint32_t *)(data + index) ;
  printf ("%08x\n", d) ;
}

小端架​​构的输出将是

05040302

大端架构的输出将是

02030405

但是,根据您的progam正在运行的处理器的体系结构,您可能遇到内存对齐问题(如果您解决未对齐的内存,性能会受到影响,如果您的处理器不支持未对齐的内存寻址,甚至会崩溃) )。

答案 2 :(得分:0)

也许您应该将数据存储为32位数组:

uint32_t data[64];
DATA = data[i];
DATA = data[i+1];
...

答案 3 :(得分:-1)

正如@dwayne-towell所提到的 - 你需要关心数据的字节顺序。在一次交易中,它可能会像下面的例子一样实现:

#include <stdio.h>
#include <stdint.h>

int
main()
{
        uint8_t data[256];
        uint32_t i, *p;

        // Add some 32bit numbers
        p = (uint32_t *)data;
        for (i = 0; i < sizeof(data)/sizeof(uint32_t); ++i) {
                *(p++) = i;
        }

        // Print some 32bit numbers
        p = (uint32_t *)data;
        for (i = 0; i < sizeof(data)/sizeof(uint32_t); ++i) {
                printf("value=%u\n", *(p++));
        }

        return (0);
}