1. 程式人生 > >C語言: BCD碼(時間)和字串之間的相互轉換

C語言: BCD碼(時間)和字串之間的相互轉換

程式碼如下:

#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#