类型转换二进制结构

时间:2019-11-13 10:43:56

标签: c struct

我已经阅读了有关如何将结构存储在内存中的想法,并提出了一种将二进制数据直接类型转换为结构的想法。我试图将类型转换为普通的struct类型,但是编译器抱怨仅对指针类型的类型转换是有效的(请参阅main的第一行)。 为什么?

在那之后,我使用了一个指针来进行结构类型转换,该转换显然成功了。当我尝试访问struct的变量时,我得到一个无声的错误退出代码11。将二进制类型强制转换为struct的正确方法是什么?或其他任何类型(例如数组)。可能在C中使用?

typedef unsigned char UINT8;
struct L{
    UINT8 ui8:4;
    UINT8 ui8v2:4;
    UINT8 ui8v3;
    UINT8 ui8v4;
};
typedef struct L L, *PL;

int main(){
    // L myStruct = (L)0b000000010000000000000001;  gives error => pointer type required
    PL pMyStruct = (PL)0b000000010000000000000001; // compiles normally
    printf("ui8: %d", pMyStruct->ui8); // but returns error code 11 at runtime

}

1 个答案:

答案 0 :(得分:1)

没有一种可移植的方式将一种类型强制转换为结构类型化的数据。

您可以使用指针,结构或memcpy来修饰类型,但该类型不可移植,并且可能会违反严格的别名规则:

示例are not recognized

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

#include <string.h>


typedef struct {
    uint8_t ui8:4;
    uint8_t ui8v2:4;
    uint8_t ui8v3;
    uint8_t ui8v4;
}L;

int main(){
    unsigned val = 0b000000010000000000000001;
    L *myStructPtr = (L *)&val;
    L myStruct;

    memcpy(&myStruct, &val, sizeof(myStruct));

    printf("0x%02x \n", myStructPtr -> ui8);
    printf("0x%02x \n", myStructPtr -> ui8v2);
    printf("0x%02x \n", myStructPtr -> ui8v3);
    printf("0x%02x \n----\n", myStructPtr -> ui8v4);

    printf("0x%02x \n", myStruct.ui8);
    printf("0x%02x \n", myStruct.ui8v2);
    printf("0x%02x \n", myStruct.ui8v3);
    printf("0x%02x \n", myStruct.ui8v4);
}