具有C / C ++结构的高效协议解码器 - 处理位

时间:2017-03-09 12:31:38

标签: c struct protocols

基本上,我有以下卫星全轨道数据(WOD)协议 Whole Orbit Data format

每个数据集的编码如下图所示 Data Set format

我已经为数据集声明了一个结构

struct wod_raw {
unsigned  mode : 1;//One bit for mode
unsigned char vbat;
unsigned char ibat;
unsigned char i_3v3;
unsigned char i_5v;
unsigned char tcomm;
unsigned char teps;
unsigned char tbatt;
};

由于WOD数据包包含32个数据集(每个57字节)和时间(epoch),因此我将WOD结构数据包声明如下

struct wod_packet {
unsigned int epoch;
wod_raw frames[32]; //32 datasets
};

我将WOD数据包保存在文件中。其大小为1856位(232字节),如格式所示。从文件中读取数据包后,将其分配给wod_packet数据包,如下所示

unsigned char* mystring;
mystring = read_from_file(filename, 232);
hexdump((char*)mystring,232); //Just to make sure data is ready properly
wod_packet* pkt = (wod_packet*)malloc(sizeof(wod_packet));
pkt = (wod_packet*)(mystring);

我毫无问题地访问了纪元数据

 printf("Unsigned epoch: %d\n",(int)pkt->epoch);

我访问了32个数据集的数组并尝试解码其中一个

wod_raw* wod;
wod = (wod_raw*)malloc(sizeof(wod));
wod =  pkt->frames;
printf("Size of frames : %d \n",sizeof(pkt));
wod_raw test = wod[0];
decode_wod_raw(test);

不幸的是,我在wod_raw结构中读取的值不正确。事实证明我的问题是由于wod_raw结构的大小是64位而不是我指定的57(unsigned int mode:1)。我一直在使用结构来编写我的协议当处理数据以全字节为框架的协议时,事情并不总是很复杂。我唯一的另一种选择是手动提取所有模式位,每个数据集(7个字节)将产生56位,但我希望可以采用更有效的方式。任何建议都非常感谢

0 个答案:

没有答案