#include <stdio.h>
#include <stdint.h>
#include <arpa/inet.h>
#pragma pack(1)
typedef struct
{
uint32_t id_len[0];
uint32_t extended : 1;
uint32_t id : 7;
uint32_t len : 24;
char data[];
} blob_attr;
#define BLOB_ATTR_ID_LEN(attr) (*((uint32_t *)(attr)->id_len))
#define BLOB_ATTR_ID_LEN_FORMAT(attr) (((attr)->extended << 31) | ((attr)->id << 24) | (attr)->len)
#define BLOB_ATTR_DATA(attr) ((attr)->data)
#pragma pack()
/*
* 0 1 2 3
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |E| id | len |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | data |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
int main()
{
blob_attr attr;
uint32_t *pattr = (uint32_t *)&attr;
attr.extended = 1;
attr.id = 3;
attr.len = 0xabcdef;
// 將 blob_attr 的開頭四個(gè)字節(jié)轉(zhuǎn)成大端号涯。
printf("before formatted: %08x\n", BLOB_ATTR_ID_LEN(&attr));
printf("after formatted: %08x\n", BLOB_ATTR_ID_LEN_FORMAT(&attr));
BLOB_ATTR_ID_LEN(&attr) = htonl(BLOB_ATTR_ID_LEN_FORMAT(&attr));
BLOB_ATTR_DATA(&attr);
printf("formatted big endian: %08x\n", BLOB_ATTR_ID_LEN(&attr));
}
before formatted: abcdef07
after formatted: 83abcdef
formatted big endian: efcdab83