转换c指针类型

时间:2010-06-09 02:40:55

标签: c pointers

我有一个指向名为uchar4的结构类型的c指针,它看起来像

{
    uchar x; 
    uchar y; 
    uchar z; 
    uchar w;
}

我也将数据作为uint8 *传入。我想创建一个指向uint8 *数据的uchar *,所以我试过这样做:

uint8 *data_in;
uchar4 *temp = (uchar4*)data_in;

但是,前8个字节似乎总是错误的。还有另一种方法吗?

编辑:

输入数据= 32 43 F6 A8 88 5A 30 8D 31 31 98 A2 E0 37 07 34

输出数据= 32 88 31 E0 37 07 34 8D 31 31 98 A2 E0 37 07 34

前半部分总是这些看似随机的值

3 个答案:

答案 0 :(得分:1)

  1. 如果sizeof(uint8) != sizeof(uchar4),则所有投注均已关闭。
  2. 你是否意识到整数的字节不一定按照你期望的顺序保存(在内存中)?
  3. 已编辑添加 此示例打印c3 d2 e1 f0。这会回答你的问题吗?

    #include <stdio.h>
    typedef unsigned char uchar;
    typedef struct {
        uchar a;
        uchar b;
        uchar c;
        uchar d;
    } uchar4;
    
    int main() {
        int theInt = 0xf0e1d2c3;
        uchar4 *p = (uchar4 *) &theInt;
        printf("%x %x %x %x\n", p->a, p->b, p->c, p->d);
        return 0;
    }
    

    另外:如果sizeof(uint8) == 8,你希望你的结构映射到哪个DWORD?

答案 1 :(得分:1)

看哪,这个卑微的联盟:

#include <stdio.h>

typedef struct {
    unsigned char x, y, z, w;
} xyzw;

typedef union {
    xyzw x;
    unsigned int i;
} ixyzw;


unsigned int xyzw_to_i(ixyzw *p)
{
    return p->i;
}

int main()
{
    xyzw x = {1, 2, 3, 4};

    printf("sizeof unsigned char %d\n", sizeof(unsigned char));
    printf("sizeof unsigned int  %d\n", sizeof(unsigned int));
    printf("sizeof xyzw          %d\n", sizeof(xyzw));
    printf("sizeof ixyzw         %d\n", sizeof(ixyzw));

    printf("xyzw = { %d, %d, %d, %d }\n", x.x, x.y, x.z, x.w);
    printf("i    = 0x%08x\n", xyzw_to_i((ixyzw *) &x));
    return 0;
}

在我的机器上碰巧产生了:

sizeof unsigned char 1
sizeof unsigned int  4
sizeof xyzw          4
sizeof ixyzw         4
xyzw = { 1, 2, 3, 4 }
i    = 0x04030201

但是不能指望编译器或机器上的这种行为。

答案 2 :(得分:0)

您的编译器将结构成员对齐为四字节边界。这就是为什么你只得到每个第四个字节(其余的假设是结构中的填充空间)。要避免此行为,您需要声明结构压缩。它是如何完成取决于编译器(并不是每个编译器都支持它)。使用GCC,你可以这样做:

struct uchar4 {
    uchar a;
    uchar b;
    uchar c;
    uchar d;
} __attribute__((__packed__));