#define get32l(p) ((p)[0] | (p)[1] << 8 | (p)[2] << 16 | (p)[3] << 24)
int autodecomp(int siz0, UCHAR *p0, int siz)
{
	unsigned char *b = p0, *c, *c0;
	int s, i, e = 0;
	if (get32l(b + 0x08) == 0x5341534f && get32l(b + 0x0c) == 0x504d434b) {
		if (get32l(b + 0x04) == 0x00000001) {
			unsigned int t = get32l(b);
			e |= 1;
void put32l(UCHAR *p, unsigned int d)
{
	p[0] =  d        & 0xff;
	p[1] = (d >>  8) & 0xff;
	p[2] = (d >> 16) & 0xff;
	p[3] = (d >> 24) & 0xff;
	return;
}
void sar_time2uc(struct sar_attrtime *at, UCHAR *uc24)
{
	int i;
	put32l(&uc24[0], at->subsec);
		/* uc24ではsubsecは1000-1000-1000形式 */
	put32l(&uc24[4], at->sec | at->min << 6 | at->hour << 12
		| at->day << 17 | at->mon << 22 | (at->year & 0x1f) << 27);
		/* yyyyymmm_mmdddddh_hhhhmmmmm_mmssssss */
	put32l(&uc24[8], at->year >> 5);
	for (i = 12; i < 24; i++)
		uc24[i] = 0;
	if (at->subsec == -1) {
		put32l(&uc24[0], 0);
		put32l(&uc24[4], 0x1f << 22); /* 31月にする */
		put32l(&uc24[8], 0);
	}
	return;
}
void sar_uc2time(UCHAR *uc24, struct sar_attrtime *at)
{
	unsigned int i = get32l(&uc24[4]);
	at->subsec = get32l(&uc24[0]);
	at->sec = i & 0x3f;
	at->min = (i >> 6) & 0x3f;
	at->hour = (i >> 12) & 0x1f;
	at->day = (i >> 17) & 0x1f;
	at->mon = (i >> 22) & 0x1f;
	at->year = i >> 27 | get32l(&uc24[8]) << 5;
	if (at->mon == 0x1f)
		at->subsec |= -1;
	return;
}

以下未完成

void sar_shiftluc24(UCHAR *uc24, int shft)
/* 1〜31 */
{
	int i;
	while (shft >= 8) {
		for (i = 23; i >= 1; i--)
			uc24[i] = uc24[i - 1];
		uc24[0] = 0;
	}

	for (i = 24; i >= 0; i--) {
		uc24[i] <<= shft;
		if (i)
			uc24)[i] |= uc24[i - 1] >> (8 - shft);
	}
	return;
}
void sar_shiftruc24(UCHAR *uc24, int shft)
/* 1〜31 */
{
	int i;
	for (i = 0; i < 6; i++) {
		((unsigned int *) uc24)[i] >>= shft;
		if (i < 5)
			((unsigned int *) uc24)[i] |= ((unsigned int *) uc24)[i + 1] << (32 - shft);
	}
	return;
}

トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS