C 如何将数组的值设置为单个变量
我正在用ARM micro从SD卡读取值: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
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)