Преобразование структуры из Little endian в Big endian - PullRequest
0 голосов
/ 30 декабря 2018

Моя проблема состоит в том, чтобы преобразовать указатель на структуру с прямым и обратным порядком байтов, чтобы я мог отправить его в сеть, поскольку моя структура состоит из 12 байтов или 92 битов, и я не могу применить ни одну стандартную или нестандартную функцию.

Я пытаюсь реализовать GTPv1U в моей системе Linux, так как мой указатель структуры состоит из 96 бит, я попытался разбить его на три части по 32 бита каждый, а затем выполнить преобразование, но я не могу его сломать, и я также сомневаюсьчто это не правильный способ сделать это

Код моей структуры

typedef struct  __attribute__((__packed__)) GTPv1Uheader{
    UInt8  version              :3;
    UInt8  ProtocolTypeFlag     :1;
    UInt8  Spare                :1;
    UInt8  ExtensionFlag        :1;
    UInt8  SequenceNumberFLAG   :1;
    UInt8  NpduNumberFlag       :1;
    UInt8  MessageType;
    UInt16 Length;
    UInt32 TEID;                    
    UInt16 SequenceNumber;
    UInt8  NPDUNumber;
    UInt8  NextExtensionheader;
} GTPv1UheaderT;

Присвоение значений

GTPv1UheaderT * IntializeGTP(){
    GTPv1UheaderT *GTPv1UheaderP;
    GTPv1UheaderP = malloc(sizeof(GTPv1UheaderT));
    memset(GTPv1UheaderP, 0, (sizeof(GTPv1UheaderT)));
    GTPv1UheaderP->version              = 0x1;
    GTPv1UheaderP->ProtocolTypeFlag     = 0x1;
    GTPv1UheaderP->Spare                = 0x0;
    GTPv1UheaderP->ExtensionFlag        = 0x0;
    GTPv1UheaderP->SequenceNumberFLAG   = 0x1;
    GTPv1UheaderP->NpduNumberFlag       = 0x0;
    GTPv1UheaderP->MessageType          = 0x01;
    GTPv1UheaderP->Length               = 0x000C;
    GTPv1UheaderP->TEID                 = 0x00000001;
    GTPv1UheaderP->SequenceNumber       = 0x0000;
    GTPv1UheaderP->NPDUNumber           = 0x00;
    GTPv1UheaderP->NextExtensionheader  = 0x00;
    return GTPv1UheaderP;
}

Ожидаемый результат: 32 01 00 0C 00 00 00 01 00 00 00 00

Фактический вывод: 49 01 0C 00 01 00 00 00 00 00 00 00

РЕДАКТИРОВАТЬ: Это была функция подкачки

long s; 
unsigned char k;
k=(unsigned char)GTPv1UheaderP;
s=(unsigned int)k;
s=ntohl(s);
printf("%ld\n",s);

Я знаю, что это не сработает, потому что мой длинный 32 бит, а указатель 96 бит.Любое другое решение

1 Ответ

0 голосов
/ 30 декабря 2018

Преобразование целого struct из / в маленький или старший порядковый номер не имеет смысла, потому что порядковый номер является свойством многобайтового представления скалярного типа, например, одного UInt16 или UInt32.При преобразовании struct в его «представление по проводам» вы просматриваете его по одному элементу за раз и подготавливаете его представление элемент за элементом.

Битовые поля представляют собой особый случай, потому чтоих порядок определяется реализацией.Вам нужно сериализовать их в один байт в порядке, который вы предпочитаете.Используйте функции hton / ntoh для преобразования отдельных многобайтовых элементов, например Length и TEID.

...