首页 > 解决方案 > 从 unit8_t 缓冲区到结构的指针类型转换

问题描述

我正在尝试将uint8_t缓冲区类型转换为structure以下bit字段。

#include<stdio.h>
#include<inttypes.h>

struct msg{
    uint64_t field:56;
};

void main()
{
   uint8_t buf[8]={0x7,0x6,0x5,0x4,0x3,0x2,0x1};
   struct msg *m = buf;
   printf("buf=%"PRIx64"\n",m->field);
}

但我得到的输出如下。

实际输出:

buf=1020304050607

预期输出:

buf=7060504030201

类型转换时我做错了什么吗?

标签: ctype-conversion

解决方案


您可以使用联合来更便携,而不是指针双关语

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


typedef union 
{
    struct 
    {
        uint64_t u56:56;
    };
    uint8_t u8[sizeof(uint64_t)];
}msg;


msg *pune(msg *message, uint8_t *data, size_t datalen, int endianes)
{
    if(endianes)
    {
        for(size_t index = 0; index < datalen; index++)
        {
            message -> u8[index] = data[index];
        }
    }
    else
    {
        for(size_t index = 0; index < datalen; index++)
        {
            message -> u8[index] = data[datalen - index - 1];
        }
    }
    return message;
}


int main()
{
    msg message;
    uint8_t buf[8]={0x7,0x6,0x5,0x4,0x3,0x2,0x1};

    printf("buf=%llx\n",pune(&message, buf, 7, 1) -> u56);
    printf("buf=%llx\n",pune(&message, buf, 7, 0) -> u56);
    return 0;
}

推荐阅读