Моя проблема состоит в том, чтобы преобразовать указатель на структуру с прямым и обратным порядком байтов, чтобы я мог отправить его в сеть, поскольку моя структура состоит из 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 бит.Любое другое решение