преобразовать байтовый массив в указатель с проблемой порядка байтов - PullRequest
2 голосов
/ 06 февраля 2020

Я должен прочитать данные из файла pcap в массив, а затем преобразовать их в указатель структуры.

, и возникает проблема с порядком байтов.

есть мой код

#include "stdio.h"

#pragma pack(1)
struct header
{
    unsigned char len:4;
    unsigned char version:4;

    unsigned short pkg_len;
    unsigned short pkg_flag;
};

int main()
{
    // assume i read 5 bytes from  a file into array a.
    unsigned char a [] = {0x45, 0xff, 0x08, 0xee, 0x09};
    header *i = (header *)&a;

    printf("%02hx %02hx %02hx %02hx\n", i->version, i->len, i->pkg_len, i->pkg_flag);
    return 0;
}

он напечатал:

 04 05 08ff 09ee

однако, что я хочу:

04 05 ff08 ee09

что мне делать? большое спасибо!

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

спасибо всем.

окончательный код выглядит так:

#include "stdio.h"

#define _UNIX
//#define WIN32

#ifdef _UNIX
#include <arpa/inet.h>
#endif
#ifdef WIN32
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
#endif

const int data4test = 1;
#define is_bigendian() ((*(char *)&data4test) == 0 )


#pragma pack(1)
struct ip_header
{
    unsigned char len:4;
    unsigned char version:4;

    unsigned short pkg_len;
    unsigned short pkg_flag;
};

int main()
{
    if (is_bigendian())
        printf("big endian \n");
    else
        printf("little endian \n");

    unsigned char a [] = {0x45, 0xff, 0x08, 0xee, 0x09};
    ip_header *i = (ip_header *)&a;

    printf("%02hx %02hx %04hx %04hx\n", i->version, i->len, htons(i->pkg_len), htons(i->pkg_flag));
    return 0;
}

Я не нашел лучшего способа решить эту проблему.

1 голос
/ 06 февраля 2020

x86 использует порядок байтов с прямым порядком байтов. Итак, вы получите правильный результат. Если вы хотите получить высокоуровневый результат (imho, вы этого хотите), вы можете изменить каждое поле с помощью функции 'htons': она меняет порядок хостов на сетевой (high-endian).

...