Closed hungtcs closed 3 years ago
通过已有数据计算出5个字节的uint8类型数据
const { gregorian, lunar, solarTerm } = item;
const [ gan, zhi ] = lunar.year;
const lunarMonth = lunar.month.startsWith('閏') ? lunar.month.substr(1) : lunar.month;
newData.push(
gregorian.year - 1900,
(gregorian.month << 4) + (gregorian.date >>> 1),
(gregorian.date << 7) + (TIAN_GAN.indexOf(gan) << 3) + (DI_ZHI.indexOf(zhi) >>> 1),
(DI_ZHI.indexOf(zhi) << 7) + ((MONTHS.indexOf(lunarMonth) + 1) << 3) + ((DATES.indexOf(lunar.date) + 1) >>> 2),
((DATES.indexOf(lunar.date) + 1) << 6) + ((lunar.leapMonth ? 1 : 0) << 5) + (JIE_QI.indexOf(solarTerm) + 1),
);
private slice(offset: number) {
const dataView = new DataView(this.arrayBuffer, offset, 5);
const [byte0, byte1, byte2, byte3, byte4] = [dataView.getUint8(0), dataView.getUint8(1), dataView.getUint8(2), dataView.getUint8(3), dataView.getUint8(4)];
return new CompoundDate(
byte0 + 1900,
byte1 >>> 4,
((byte1 & 0x0F) << 1) + (byte2 >>> 7),
((byte2 >>> 3) & 0x0F),
((byte2 << 1) & 0x0F) + (byte3 >>> 7),
(byte3 & 0x7F) >>> 3,
((byte3 & 0x07) << 2) + (byte4 >>> 6),
((byte4 >>> 5) & 0x01) === 0x01,
byte4 & 0x1F,
);
}
为了进一步压缩数据文件的大小,考虑新增二进制的数据格式。 初步概定为:每5个字节(40个bit)代表一天。
当前年份 - 1900
,如2020年
数据为2020-1900=120(0x78)
12月
为0xC
甲
为0B0
子
为0B0
十一月
为0B1011
0B1
0B00000
去掉了
星期
和生肖
数据,星期
可以从公历日期计算,生肖
和地支
对应。例如:2020-12-15 庚子 十一月 初一 非闰月 无节气
将所有数据按每天5个字节的形式,依次排列,写入到单个二进制文件,从1901年1月1日到2100年12月31日,共
73048
天每天占5个字节,那么总大小为
73048 * 5
个字节,即365.24KB
。对比csv文件(3.5M)和json文件(11M)有非常明显的提升。