如何将struct成员分解为单个单词的字节

时间:2012-08-17 18:40:29

标签: c structure

假设我有一个C结构:

typedef struct {
UINT8  nRow;
UINT8  nCol;
UINT16 nData; } tempStruct;

有没有办法将结构的所有3个成员都放在一个32位的单词中,但仍然可以单独访问它们?

4 个答案:

答案 0 :(得分:3)

借助union s?

的帮助
typedef struct {
 UINT8  nRow;
 UINT8  nCol;
 UINT16 nData; 
} 
tempStruct;

typedef union {
 tempStruct myStruct;
 UINT32 myWord;
} stuff;

甚至更好(没有“中间”结构):

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

typedef union {
    struct {
        int  nRow:8;
        int  nCol:8;
        int nData:16;
    }; 
    int myWord;
} stuff;

int main(int args, char** argv){
    stuff a;
    a.myWord=0;
    a.nCol=2;
    printf("%d\n", a.myWord);
    return 0;
}

答案 1 :(得分:1)

将它称为UINT32怎么样?这不像C是类型安全的。

tempStruct t;
t.nRow = 0x01;
t.nCol = 0x02;
t.nData = 0x04;

//put a reference to the struct as a pointer to a UINT32
UINT32* word = (UINT32 *) &t;

printf("%x", *word);

然后,您可以通过取消引用指针来获取结构的值作为32位字。您的系统的细节可能很重要,但是......如果我在我的机器上运行它,word的值是0x00040201 ---也就是说,字段的顺序相反。如果您尝试将其序列化到另一个系统,我认为不一定会出现这种情况,因此它不可移植。

如果你想将它实际存储为32位整数然后单独引用字段,为什么不呢?

UINT32 word = 0x01020004;

然后在其他地方......

UINT8* row(UINT32 word) {
    return (UINT8 *) &word + 3;
}

UINT8* col(UINT32 word) {
    return ((UINT8 *) &word) + 2;
}

UINT16* data(UINT32 word) {
    return ((UINT16 *) &word);
}

宏将有助于便携式字节顺序。

答案 2 :(得分:0)

是的,您可以在C中使用bit fields来执行此操作。类似的东西:

typedef struct {
  unsigned nRow : 8;
  unsigned nCol : 8;
  unsigned nData : 16;
} tempStruct; 

如果您还想控制内存布局,可能需要查看#pragma pack。一些编译器可以使用非便携式选项。

答案 3 :(得分:0)

typedef struct {
 int  nRow:8;
 int  nCol:8;
 int nData:16; } tempStruct;

nRow只需8位,nCol需要8位,nDate需要16位。

这对你有用。

我刚刚编写了示例程序来查看它的大小

#include<stdio.h>
typedef struct {
     int  nRow:8;
     int  nCol:8;
     int nData:16; } tempStruct;

typedef struct {
     int  nRow;
     int  nCol;
     int nData; } tempStructZ;

int main(void) {
      printf("%d\n", sizeof(tempStruct));
      printf("%d\n", sizeof(tempStructZ));
      return 0;
}

输出: 4 16