解析3个部分中的2个字节

时间:2015-05-18 23:16:14

标签: arrays parsing masking bits

我必须解析一个有2个字节的字段,并保存日期时间信息。 要获取数据时间,此字段具有以下结构:

每天5位,月份4位,年份7位(总共16位)

要获得我正在使用的那一天:

字节日=(字节)(数组[0]>> 3); (没关系)

我也可以获得这一年,但我无法获得月份价值,你能帮我解决这个问题吗?

数组值是:{243,29}我必须得到这个日期时间:30/6/2019

谢谢!

2 个答案:

答案 0 :(得分:1)

翻译成您选择的语言。

#include <stdio.h>

int array[2] = { 243,29 };

int main(void)
{
   int fullval = array[0] << 8 | array[1];
   int day = (fullval >> 11) & 31;   
   int year = 1990 + (fullval & 127);
   int month = (fullval >> 7) & 15;
   printf ("%d/%d/%d\n", day, month, year);
}

答案 1 :(得分:0)

鉴于你的评论,我猜你遇到的问题是按位OR和AND运算符,在java中将是&#34; |&#34;和&#34;&amp;&#34; - 使用其他语言,可能会有所不同,但它确实存在。

按位&#34; |&#34;帮助您组合两个字节的位:

 0000 0001  |  0000 0010  ---->  0000 0011

而按位&#34;&amp;&#34;帮助你屏蔽一些位:

 0101 0110  &  1111 0000  ----> 0101 0000

使用按位移位运算符(您已经在使用),您可以移动位(&#34;&gt;&gt;&#34;或&#34;&lt;&lt;&#34;),提取某些位而忽略其他位(&#34;&amp;&#34;)并组合位(&#34; |&#34;)。

这意味着,您可以从第一个字节中提取三个月的位,将它们移过一位,然后从第二个字节中提取剩余的位,最后将这两个位组合起来。