将字节数组转换为带有字节序问题的指针

convert byte array to a pointer with problem of endian

本文关键字:字节 问题 指针 字节数 数组 转换      更新时间:2023-10-16

我应该将数据从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 %02hxn", i->version, i->len, i->pkg_len, i->pkg_flag);
return 0;
}

它打印了:

04 05 08ff 09ee

但是,我想要的是:

04 05 ff08 ee09

我该怎么办?非常感谢!

x86 使用小端字节顺序。所以,你得到正确的结果。 如果你想得到高端结果(恕我直言,你想要(,你可以用"htons"函数更改每个字段:它将主机顺序更改为网络(高端(顺序。

谢谢大家。

最终代码是这样的:

#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 %04hxn", i->version, i->len, htons(i->pkg_len), htons(i->pkg_flag));
return 0;
}

我没有找到解决这个问题的更好方法。