Преобразование типов указателей c - PullRequest
0 голосов
/ 09 июня 2010

У меня есть переменный указатель на тип structre, называемый uchar4, который выглядит как

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

У меня также есть данные, переданные как uint8 *.Я хотел бы создать uchar *, указывающий на данные в uint8 *, поэтому я попытался сделать это:

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

выходdata = 32 88 31 E0 37 07 34 8D 31 31 98 A2 E0 37 07 34

Первая половина - это всегда эти, казалось бы, случайные значения

Ответы [ 3 ]

1 голос
/ 09 июня 2010

Вот скромный союз:

#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

, но нельзя рассчитывать на это поведение на компиляторах или машинах.

1 голос
/ 09 июня 2010
  1. Если sizeof(uint8) != sizeof(uchar4), то все ставки отключены.
  2. Понимаете ли вы, что байты целого числа не обязательно хранятся (в памяти) в том порядке, в котором вы ожидаете?

Отредактировано для добавления В этом примере печатается 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 вы хотите, чтобы ваша структура отображалась?

0 голосов
/ 10 июня 2010

Ваш компилятор выравнивает члены структуры на границе четырех байтов. Вот почему вы получаете только каждый четвертый байт (остальные предполагается, что в структуре это пробел). Чтобы избежать такого поведения, вам нужно объявить структуру pack . Как это сделать, зависит от компилятора (и не каждый компилятор его поддерживает). С GCC вы делаете это так:

struct uchar4 {
    uchar a;
    uchar b;
    uchar c;
    uchar d;
} __attribute__((__packed__));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...