public override async Task Decode(EbmlParser parser, bool forceDecode = false) { if (Decoded && !forceDecode) { return; } if (parser == null) { throw new ArgumentNullException(nameof(parser)); } if (parser.DataAccessor == null) { throw new InvalidOperationException( ExceptionsResourceManager.ResourceManager.GetString("InvalidDecodeState", CultureInfo.CurrentCulture)); } switch (DataSize.DataSize) { case 0: Value = 0; break; case 4: var floatBuffer = new byte[4]; parser.DataAccessor.Position = DataPosition; await parser.DataAccessor.ReadAsync(floatBuffer, 0, 4).ConfigureAwait(false); Utility.ConvertEndiannes(floatBuffer); Value = BitConverter.ToSingle(floatBuffer); break; case 8: var doubleBuffer = new byte[8]; parser.DataAccessor.Position = DataPosition; await parser.DataAccessor.ReadAsync(doubleBuffer, 0, 8).ConfigureAwait(false); Utility.ConvertEndiannes(doubleBuffer); Value = BitConverter.ToDouble(doubleBuffer); break; default: throw new DecodeException("Can not decode a decimal number that is not either 0, 4 or 8 bytes long"); } Decoded = true; }
public DataPage(byte[] page) { _byteIterator = 0; Records = new List <Record> { Capacity = Static.GetRecordsPerPage() }; UsedSpace = BC.ToInt32(page, _byteIterator); _byteIterator += sizeof(int); for (var i = 0; i < UsedSpace; i++) { var key = BC.ToUInt32(page, _byteIterator); _byteIterator += sizeof(uint); var radius = BC.ToDouble(page, _byteIterator); _byteIterator += sizeof(double); var angle = BC.ToInt16(page, _byteIterator); _byteIterator += sizeof(short); Records.Add(new Record(key, radius, angle)); } }
public static double ToDouble(ReadOnlySpan <byte> value) => Converter.ToDouble(value);
/// <summary>转为浮点数</summary> /// <param name="value">待转换对象</param> /// <param name="defaultValue">默认值。待转换对象无效时使用</param> /// <returns></returns> public virtual Double ToDouble(Object value, Double defaultValue) { if (value == null || value == DBNull.Value) { return(defaultValue); } // 特殊处理字符串,也是最常见的 if (value is String str) { str = ToDBC(str).Trim(); if (str.IsNullOrEmpty()) { return(defaultValue); } if (Double.TryParse(str, out var n)) { return(n); } return(defaultValue); } else 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)); default: // 凑够8字节 if (buf.Length < 8) { var bts = new Byte[8]; Buffer.BlockCopy(buf, 0, bts, 0, buf.Length); buf = bts; } return(BitConverter.ToDouble(buf, 0)); } } try { return(Convert.ToDouble(value)); } catch { return(defaultValue); } }
/// <summary> /// 从流中读入一个 <see cref="T:System.Int64"/> /// </summary> /// <param name="stream">要读取的流</param> /// <returns>读取的 <see cref="T:System.Int64"/></returns> public static double ReadDouble(this Stream stream) { return(BitConverter.ToDouble(stream.ReadBuffer(sizeof(double)), 0)); }