Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将数组的值设置为单个变量_C_Arrays - Fatal编程技术网

C 如何将数组的值设置为单个变量

C 如何将数组的值设置为单个变量,c,arrays,C,Arrays,我正在用ARM micro从SD卡读取值: Res = f_read(&fil, (void*)buf, 6, &NumBytesRead); 其中fil是指针,buf是存储数据的缓冲区 这就是问题所在:它是一个数组,但我想把数组的内容放在一个变量中 举一个实际的例子:从文件中读取的6个字节是: buf[0] = 0x1B buf[1] = 0x26 buf[2] = 0xB3 buf[3] = 0x54 buf[4] = 0xA1 buf[5] = 0xCF 我希望:uin

我正在用ARM micro从SD卡读取值:

Res = f_read(&fil, (void*)buf, 6, &NumBytesRead);
其中
fil
是指针,
buf
是存储数据的缓冲区

这就是问题所在:它是一个数组,但我想把数组的内容放在一个变量中

举一个实际的例子:从文件中读取的6个字节是:

buf[0] = 0x1B
buf[1] = 0x26
buf[2] = 0xB3
buf[3] = 0x54
buf[4] = 0xA1
buf[5] = 0xCF

我希望:
uint64_t data
等于
0x1B26B354A1CF
。也就是说,数组的所有元素都“串联”在一个64位整数中。

使用union,但请记住ENDIANE

 union 
 {
      uint8_t u8[8];
      uint64_t u64;
  }u64;

typedef联合 { uint8_t u8[8]; uint64_t u64; }u64


没有类型双关,你可以做如下

uint64_t data = 0;
for (int i=0; i<6; i++)
{
  data <<= 8;
  data |= (uint64_t) buf[i];
}
uint64\u t数据=0;

对于(int i=0;i)要注意的事项:

  • 字节的顺序是否正确
  • 将六个字节读入一个64位整数
  • 问题1可以通过将网络字节顺序(Big-Endian)中的字节存储到主机字节顺序的64位整数中来解决,例如使用以下两个宏:

        /* below defines of htonll() and ntohll() are taken from this answer:
           https://stackoverflow.com/a/28592202/694576
         */
        #if __BIG_ENDIAN__
        # define htonll(x) (x)
        # define ntohll(x) (x)
        #else
        # define htonll(x) ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
        # define ntohll(x) ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
        #endif
    
    而不是

      uint8_t buffer[BUFFER_SIZE];
    
    使用

    而不是

      memcpy(&number, buffer, BUFFER_SIZE)
      number = ntohll(number)
    
    使用


    fil
    指向什么,为什么传递它的地址?@M.M根据文档:fil*FileObject,/*指向文件对象结构的指针*/.fil被声明为:static fil;@alk what update?我刚刚编辑过。输入数组是big-endian。顺序是100%OKBTW:
    memcpy()
    memmove()便宜
    .intential:)以防有人经过重叠的对象。
    union buffer_wrapper
    {
      uint8_t u8[sizeof (uint64_t)];
      uint64_t u64;
    }
    
      uint8_t buffer[BUFFER_SIZE];
    
      union buffer_wrapper buffer;
    
      memcpy(&number, buffer, BUFFER_SIZE)
      number = ntohll(number)
    
      number = ntohll(buffer.u64)