C語言: BCD碼(時間)和字串之間的相互轉換
阿新 • • 發佈:2018-12-21
程式碼如下:
#include <stdio.h> #include <stdlib.h> typedef unsigned char BYTE; typedef unsigned int DWORD; typedef unsigned short WORD; /******************************************************************************************* 函式名稱: BcdTime2String 描 述 : BCD時間轉為字串函式 (按照格式) 輸入引數: 將要轉換的BCD陣列:bcd_buf ,以及轉換之後將要儲存到的陣列:tmp_buf 輸出引數: 無 返 回 : 無 ********************************************************************************************/ void BcdTime2String(BYTE bcd_buf[], BYTE tmp_buf[] ) { /* 檔名格式為: “2018-09-15 12:25:26.mp4” */ tmp_buf[0] = '2'; //2 /* 年份 */ tmp_buf[1] = '0'; //0 tmp_buf[2] =( bcd_buf[0] >> 4) +( 0x30); //1 (BCD碼轉為ASCII碼時要加0x30,還要注意運算子優先順序) tmp_buf[3] = (bcd_buf[0] & 0x0f) + (0x30); //8 tmp_buf[4] = 0x2D; // - 中間橫槓的ASCII碼 tmp_buf[5] =( bcd_buf[1] >> 4) +( 0x30); //0 /* 月份 */ tmp_buf[6] = (bcd_buf[1] & 0x0f) + (0x30); //9 tmp_buf[7] = 0x2D; // - () tmp_buf[8] = ( bcd_buf[2] >> 4) +( 0x30); //1 /* 天數 */ tmp_buf[9] = (bcd_buf[2] & 0x0f) + (0x30);//5 tmp_buf[10] = 0x20; // 空格的ASCII碼 tmp_buf[11] = ( bcd_buf[3] >> 4) +( 0x30);//1 /* 小時 */ tmp_buf[12] = (bcd_buf[3]& 0x0f) + (0x30);//2 tmp_buf[13] = 0x3A; //冒號的ASCII碼 tmp_buf[14] = ( bcd_buf[4] >> 4) +( 0x30); //2 /* 分鐘 */ tmp_buf[15] = (bcd_buf[4] & 0x0f) + (0x30); //5 tmp_buf[16] = 0x3A; //冒號的ASCII碼 tmp_buf[17] = ( bcd_buf[5] >> 4) +( 0x30); //2 /* 秒數 */ tmp_buf[18] = (bcd_buf[5] & 0x0f) + (0x30); //6 } /******************************************************************************************* 函式名稱: String2BcdTime 描 述 : 把檔名字串轉為BCD碼時間 輸入引數: 將要轉換的儲存檔名字串的陣列 ,以及轉換之後將要儲存bcd時間的陣列 輸出引數: 無 返 回 : 無 ********************************************************************************************/ void String2BcdTime(BYTE name_buf[], BYTE bcd_buf[]) { /* 檔名格式為: “2018-09-15 12:25:26.mp4” */ /* BCD 時間格式為 “180915122526” */ bcd_buf[0] = (BYTE)((name_buf[2] - '0')<<4) + (name_buf[3] - '0'); bcd_buf[1] = (BYTE)((name_buf[5] - '0')<<4) + (name_buf[6] - '0'); bcd_buf[2] = (BYTE)((name_buf[8] - '0')<<4) + (name_buf[9] - '0'); bcd_buf[3] = (BYTE)((name_buf[11] - '0')<<4) + (name_buf[12] - '0'); bcd_buf[4] = (BYTE)((name_buf[14] - '0')<<4) + (name_buf[15] - '0'); bcd_buf[5] = (BYTE)((name_buf[17] - '0')<<4) + (name_buf[18] - '0'); } void printf_debug(BYTE name_buf[], BYTE bcd_buf[], BYTE tmp_buf[]) { int i; printf(" name_buf : %s \n",name_buf); printf(" bcd_buf : "); for(i=0;i<6;i++) printf("%02x",bcd_buf[i]); printf("\n"); printf(" tmp_buf : %s \n",tmp_buf); } int main() { BYTE name_buf[32] = "2018-09-15 12:25:26.mp4"; BYTE bcd_buf[6] = {0}; BYTE tmp_buf[32] = {0}; printf_debug(name_buf, bcd_buf, tmp_buf); /*字串轉為BCD碼時間*/ String2BcdTime(name_buf, bcd_buf); printf_debug(name_buf, bcd_buf, tmp_buf); /*BCD碼轉為字串*/ BcdTime2String(bcd_buf, tmp_buf); printf_debug(name_buf, bcd_buf, tmp_buf); return 0; }
執行結果:
[email protected]:/home# ./test
name_buf : 2018-09-15 12:25:26.mp4
bcd_buf : 000000000000
tmp_buf :
name_buf : 2018-09-15 12:25:26.mp4
bcd_buf : 180915122526
tmp_buf :
name_buf : 2018-09-15 12:25:26.mp4
bcd_buf : 180915122526
tmp_buf : 2018-09-15 12:25:26
[email protected]:/home#