将字节数组转换为带有字节序问题的指针
convert byte array to a pointer with problem of endian
我应该将数据从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;
}
我没有找到解决这个问题的更好方法。
相关文章:
- 将字节数组转换为带有字节序问题的指针
- DNS 查询格式标头结构中的小字节序问题
- C++浮点数和字节数组的联合问题
- pyserial arduino 字节阵列解码问题
- c_str() 只读取了我的字符串的一半,为什么?我该如何解决这个问题?是字节问题吗?
- 从 midi 文件读取字节时出现问题
- 正确处理字节对齐问题 - 通过UDP在16位嵌入式系统和32位桌面之间
- (C++)ReadProcessMemory-读取一个字节时出现问题
- 从流或字节中读取结构时遇到问题
- 我的字节数组到十六进制字符串转换器有什么问题,或者为什么它在写入文件时会在某个位置后剪切符号?
- 16 字节对齐问题
- Winsock send() 单字节传输的问题
- Windows TreeView常见控件通知和多字节字符集的问题
- JNI-从jstring到字节的传输,从字节到字符串的传输问题
- Crypto++多字节/unicode问题
- opengl =中缓冲区数据的问题仅在我缓冲比需要更多的字节时绘制
- 从字节数组读取类型的模板方法的问题
- c++字节读取问题
- ObjC/C++中的字节数组封送到IOS中的C#时出现问题
- 网络字节顺序和字节序问题