轉換 FAT 的日期變數到一個C型態的字串

因為工作需要寫了一個 FAT型別 DATE (WORD)  to String的轉換函式,因為工作平台都是 Intel 的Big Endian 所以寫的比較簡略一點。
FAT 格式是直接參考這個網址的資訊 refer http://en.wikipedia.org/wiki/File_Allocation_Table

#define Num2Char(x)  ((x)+'0')
static void Num2Year(BYTE n, char* szBuff)
{
	int ny = 1980 + n;
	static int divs[] = { 1000, 100, 10 };
	char t;
	
	for (int i = 0; i < 3; i++)
	{
		t = (ny/divs[i]);
		
		if (t > 0)
			ny -= t*divs[i];

		szBuff[i] = Num2Char(t);
	}
	
	szBuff[3] = Num2Char(ny);
}

static void Num2Month(BYTE n, char* szBuff)
{
	BYTE idx = 0;
	const static char szMonth[13][5] = { "ERR.", 
		"Jan.", "Feb.", "Mar.", "Apr.", "May", "Jun.",
		"Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec." };
	
	idx = (n > 0 && n < 13) ? n : 0;
	memcpy(szBuff, szMonth[idx], 4);
}

static void Num2Day(BYTE n, char* szBuff)
{
	char t;
	t = n/10;

	if (t>0)
	{
		szBuff[0] = Num2Char(t);
		n -= t*10;
	} else {
		szBuff[0] = ' ';
	}
	szBuff[1] = Num2Char(n);
}
#undef Num2Char

// the function converted a dword to string
BOOL DateToStr(DWORD dwD, char *szB, int n) {	
	PBYTE p = (PBYTE)&dwD;
	
	if (n < 13) return FALSE;

	Num2Month(p[1], szB);
	szB[4] = ' ';
	Num2Day(p[0], szB+5);
	szB[7] = ' ';
	Num2Year(p[2], szB+8);
	szB[12] = '';

	return TRUE;
}

DWORD bytesToDate(BYTE *b)
{
	DWORD result = 0;
	PBYTE  pR = (PBYTE)&result;
	// FAT has 2byre
	// bit 15 ~ 9, YEAR  0 == 198, 127 == 2107
	// bit 8 ~ 5,  MONTH 1(JAN) ~ 12(DEC)
	// bit 4 ~ 0,  DAY   1 ~ 31
	pR[2] = (b[1] >> 1);            // Year
	pR[1] = (b[1] & 1) ? 0x08 : 0;
	pR[1] |=  ((b[0] >> 5) & 0x0F); // Month
	pR[0] = (b[0] & 0x1F);				// Day
	return result;
}

測試程式

extern BOOL DateToStr(DWORD dwD, char *szB, int n);
extern DWORD bytesToDate(BYTE *b);


typedef union {
	DWORD Date;
	struct {
		BYTE day;
		BYTE month;
		BYTE year;
	};
} DATE;

int main(int argc, char* argv[])
{
	char szDate[14];
	DATE  d;
	unsigned short fatd;
	unsigned short year = 2100 - 1980;
	unsigned short month = 1;
	unsigned short day = 1;
	DWORD dwDate;
	PBYTE p = (PBYTE)&dwDate;

	fatd = (year << 9 | month << 5 | day );

	dwDate = bytesToDate((PBYTE)&fatd);
	DateToStr(dwDate, szDate, sizeof(szDate));
	printf(szDate);
	printf("n");
	d.year = (2080-1980);
	d.month = 3;
	d.day = 24;
	*p = 2;
	*(p+1) = 12;
	*(p+2) = (2007-1980);
	DateToStr(dwDate, szDate, sizeof(szDate));
	printf(szDate);
	printf("n");
	DateToStr(d.Date, szDate, sizeof(szDate));
	printf(szDate);
	printf("n");
	return 0;
} 
廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: