#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;
  }
 -勝手にコメント欄つけてしまいました。以下、でやってみましたが、だめでした。でも動作をかえてやると時刻の結果がかわるので、関連しているのは間違いなさそうです。 -- ''くーみん'' SIZE(10){2005-05-23 (月) 19:28:46}
 
  void sar_shiftluc24(UCHAR *uc24, int shft)
  /* 1〜31 */
  {
  	int i;
  	while (shft >= 8) {
  		for (i = 24; i >= 1; i--)
  			uc24[i] = uc24[i - 1];
  		uc24[0] = 0;
  		shft-=8;
  	}
  	for (i = 24; i >= 1; 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;
  	while(shft>=8){
  		for (i = 0; i <24; i++)
  			uc24[i] = uc24[i + 1];
  		uc24[24] = 0;
  		shft-=8;
  	}
  	for (i = 0; i <= 24; i++) {
  		uc24[i] >>= shft;
  		if (i<24)
  			uc24[i] |= uc24[i + 1] << (8 - shft);
  	}
  	return;
  }
 
 
 #comment

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS