public static ClockValues Decode2(byte[] bytes, int startindex) { byte datatype = bytes[startindex]; startindex++; int index; index = startindex + Varint.Read(bytes, startindex, out int tsLen);//时标段; TimeDecoder tdec = (TimeDecoder)DecoderFactory.Get(DataTypeEnum.DateTime); tdec.SetBytes(bytes, index, tsLen); index = index + tsLen; index = index + Varint.Read(bytes, index, out int vsLen);//数值段; IDecoder vdec = DecoderFactory.Get(datatype); vdec.SetBytes(bytes, index, vsLen); index = index + vsLen; index = index + Varint.Read(bytes, index, out int qsLen);//质量段; IntegerDecoder qdec = (IntegerDecoder)DecoderFactory.Get(DataTypeEnum.Integer); qdec.SetBytes(bytes, index, qsLen); ClockValues result = new ClockValues(); if (datatype == DataTypeEnum.Double) { FloatDecoder decoder = (FloatDecoder)vdec; while (tdec.Next() && vdec.Next() && qdec.Next()) { result.Append(decoder.Create(tdec.Read(), decoder.Read(), (int)qdec.Read())); } } else if (datatype == DataTypeEnum.Boolean) { BooleanDecoder decoder = (BooleanDecoder)vdec; while (tdec.Next() && vdec.Next() && qdec.Next()) { result.Append(decoder.Create(tdec.Read(), decoder.Read(), (int)qdec.Read())); } } else if (datatype == DataTypeEnum.Integer) { IntegerDecoder decoder = (IntegerDecoder)vdec; while (tdec.Next() && vdec.Next() && qdec.Next()) { result.Append(decoder.Create(tdec.Read(), decoder.Read(), (int)qdec.Read())); } } else if (datatype == DataTypeEnum.String) { StringDecoder decoder = (StringDecoder)vdec; while (tdec.Next() && vdec.Next() && qdec.Next()) { result.Append(decoder.Create(tdec.Read(), decoder.Read(), (int)qdec.Read())); } } DecoderFactory.Put(DataTypeEnum.DateTime, tdec); DecoderFactory.Put(DataTypeEnum.Integer, qdec); DecoderFactory.Put(datatype, vdec); return(result); }
// BlockCount returns the number of timestamps encoded in block. public static int BlockCount(byte[] bytes) { int tsLen, index; index = 1 + Varint.Read(bytes, 1, out tsLen); return(TimeDecoder.CountTimestamps(bytes, index, tsLen)); }