2015-05-18 11 views
0

我必須解析一個字段,它有2個字節,並保存日期時間信息。 要獲得DATATIME,這一領域具有這樣的結構:解析3個部分中的2個字節

5位爲天,一個月4位和第7位爲一年(共16位)

爲了讓我使用了天:

byte day =(byte)(array [0] >> 3); (沒關係)

我也可以得到一年,但我無法得到月份的價值,你能幫助我嗎?

數組值是:{} 243,29和我一定要得到這個日期時間:30/6/2019

謝謝!

+0

爲什麼你不能得到這個月? – rmalchow

+0

我不知道如何解析它,因爲它共享來自第一個數組值的3位和來自第二個數據庫的1位 – Nico812

+0

@ Nico812因此,從第一個值中提取3位,從第二個位中提取1位併合並它們。或者,更好的是,首先將兩個值結合起來。 –

回答

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); 
} 
+0

完美!謝謝,它的工作原理!對不起,你能解釋我你做了什麼?因爲那麼我必須將日期時間保存在字節數組中,並且我想知道如何進行反轉。 – Nico812

+0

我將這兩個值組合成一個16位的值,然後提取我需要的部分。 –

+0

謝謝大衛,你幫了我很多! – Nico812

0

給出你的評論,我想你遇到的問題是按位OR和AND運算符,這在java中是「|」和「&」 - 與其他語言一樣,可能會有所不同,但它確實存在。

按位「|」幫助您從兩個字節結合位:

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

同時按位「&」可以幫助你屏蔽掉一些位:

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

與按位移位運算符(你已經在使用),你可以移動位(「>>」或「< <」),提取某些位而忽略其他位(「&」)併合並位(「|」)。

這意味着,您可以從第一個字節中提取三個月份的位,將它們移動一位,然後從第二個字節中提取剩餘位,最後將這兩個位合併。

+0

非常感謝您的解釋! – Nico812