我有一个指向名为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
前半部分总是这些看似随机的值
答案 0 :(得分:1)
sizeof(uint8) != sizeof(uchar4)
,则所有投注均已关闭。 已编辑添加
此示例打印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__));