public BTreePage(byte[] pageData) { _byteIterator = 0; Records = new List <NodeRecord> { Capacity = (int)Static.MemMax }; Childrens = new List <long> { Capacity = (int)Static.ChilMax }; ParentIndex = BC.ToInt64(pageData, _byteIterator); _byteIterator += sizeof(long); SelfIndex = BC.ToInt64(pageData, _byteIterator); _byteIterator += sizeof(long); _presentRecords = BC.ToInt64(pageData, _byteIterator); _byteIterator += sizeof(long); IsLeaf = BC.ToBoolean(pageData, _byteIterator); _byteIterator += sizeof(bool); for (var i = 0; i < _presentRecords; i++) { var key = BC.ToInt64(pageData, _byteIterator); _byteIterator += sizeof(long); var pageIndex = BC.ToInt64(pageData, _byteIterator); _byteIterator += sizeof(long); Records.Add(new NodeRecord(key, pageIndex)); } if (!IsLeaf) { for (var i = 0; i < _presentRecords + 1; i++) { Childrens.Add(BC.ToInt64(pageData, _byteIterator)); _byteIterator += sizeof(long); } } }
public BTreeHeaderPage(byte[] headerPage) { RootIndex = BC.ToInt64(headerPage, _byteIterator); _byteIterator += sizeof(long); }
/// <summary> /// 返回指定的字节数组中以指定位置的字节转换来的值 /// </summary> /// <param name="buffer">来源字节数组</param> /// <param name="offset">数据偏移</param> /// <returns>值</returns> public static long ToInt64(this byte[] buffer, int offset) { return(BitConverter.ToInt64(buffer, offset)); }
public static long ToInt64(ReadOnlySpan <byte> value) => Converter.ToInt64(value);
/// <summary>转为长整数。支持字符串、全角、字节数组(小端)、时间(Unix毫秒)</summary> /// <param name="value">待转换对象</param> /// <param name="defaultValue">默认值。待转换对象无效时使用</param> /// <returns></returns> public virtual Int64 ToLong(Object value, Int64 defaultValue) { if (value == null || value == DBNull.Value) { return(defaultValue); } // 特殊处理字符串,也是最常见的 if (value is String str) { // 拷贝而来的逗号分隔整数 str = str.Replace(",", null); str = ToDBC(str).Trim(); if (str.IsNullOrEmpty()) { return(defaultValue); } if (Int64.TryParse(str, out var n)) { return(n); } return(defaultValue); } // 特殊处理时间,转Unix毫秒 if (value is DateTime dt) { if (dt == DateTime.MinValue) { return(0); } //// 先转UTC时间再相减,以得到绝对时间差 //return (Int32)(dt.ToUniversalTime() - _dt1970).TotalSeconds; return((Int64)(dt - _dt1970).TotalMilliseconds); } if (value is DateTimeOffset dto) { if (dto == DateTimeOffset.MinValue) { return(0); } return((Int64)(dto - _dto1970).TotalMilliseconds); } if (value is Byte[] buf) { if (buf == null || buf.Length < 1) { return(defaultValue); } switch (buf.Length) { case 1: return(buf[0]); case 2: return(BitConverter.ToInt16(buf, 0)); case 3: return(BitConverter.ToInt32(new Byte[] { buf[0], buf[1], buf[2], 0 }, 0)); case 4: return(BitConverter.ToInt32(buf, 0)); case 8: return(BitConverter.ToInt64(buf, 0)); default: break; } } //暂时不做处理 先处理异常转换 try { return(Convert.ToInt64(value)); } catch { return(defaultValue); } }