static StringPlus() { Base64 = UnmanagedPlus.Get(64); var base64 = Base64.Byte; foreach (var code in "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/") *base64++ = (byte) code; }
private void _read() { _length = m_io.ReadU1(); if (IsPointer) { _pointer = new PointerStruct(m_io, this, m_root); } if (!(IsPointer)) { _name = System.Text.Encoding.GetEncoding("utf-8").GetString(m_io.ReadBytes(Length)); } }
private static void VerifyRefName(List <DnsPacket.Label> name) { Assert.AreEqual((int)1, name.Count); Label l = name[0]; Assert.IsTrue(l.IsPointer); Assert.IsTrue(0xC0 == l.Length); Assert.IsTrue(0x0C == l.Pointer.Value); PointerStruct ps = l.Pointer; VerifyName(ps.Contents.Name, StrQueryDomainName); }
private void _parse() { f_isPointer = false; _length = m_io.ReadU1(); if (IsPointer) { _pointer = new PointerStruct(m_io, this, m_root); } if (!IsPointer) { _name = System.Text.Encoding.GetEncoding("ASCII").GetString(m_io.ReadBytes(Length)); } }
public void ParseInvalidRefNameLength() { // Modify name segment length to exceed packet data end // offset 36, 0xC0, -> pointer, offset 0 << 8 + data[37] // offset 37, 0x0C, -> begining of name in header, 'china' // modify offset as 24, so that offset + length >= data size, i.e. 36 byte[] byteData = udpPackets[2].PayloadData; Assert.IsTrue(0xC0 == byteData[36]); Assert.IsTrue(0x0C == byteData[37]); byteData[36] = 0xC1; byteData[37] = (byte)byteData.Length; //try { DnsPacket dnsPacket = new DnsPacket(new KaitaiStream(byteData)); DnsPacket.Query q = dnsPacket.Body.Queries[0]; VerifyName(q.Name.Name, StrQueryDomainName); DnsPacket.Answer a = dnsPacket.Body.Answers[0]; Assert.IsTrue(DnsPacket.ClassType.InClass == a.AnswerClass); Assert.IsTrue(600 == a.Ttl); Assert.IsTrue(DnsPacket.TypeType.A == a.Type); //VerifyRefName(a.Name.Name); { Assert.AreEqual((int)1, a.Name.Name.Count); Label l = a.Name.Name[0]; Assert.IsTrue(l.IsPointer); Assert.IsTrue(0xC1 == l.Length); Assert.IsTrue(byteData.Length == l.Pointer.Value); PointerStruct ps = l.Pointer; try { VerifyName(ps.Contents.Name, StrQueryDomainName); } catch (System.IO.EndOfStreamException) { Assert.IsTrue(true); } } } //catch (System.IO.EndOfStreamException) { Assert.IsTrue(true); } return; }
public void PointerTStructTest() { MemoryBufferAddressSpace dataSource = new MemoryBufferAddressSpace(new byte[] { 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 }); LayoutManager mgr = new LayoutManager().AddPrimitives().AddSizeT(4).AddPointerTypes().AddTStructTypes(); Reader reader = new Reader(dataSource, mgr); PointerStruct s = reader.Read <PointerStruct>(0); Assert.Equal((ulong)0x4, s.P.Value); Assert.False(s.P.IsNull); Assert.Equal((uint)0x1, s.P.Dereference(dataSource)); Assert.Equal((ulong)0x1, s.P32.Value); Assert.Equal((byte)0x0, s.P32.Dereference(dataSource)); Assert.Equal((byte)0x1, s.P32.Element(dataSource, 3)); Assert.Equal((ulong)0x2, s.P64.Value); Assert.Equal((ulong)0x0002000000010000, s.P64.Dereference(dataSource)); }
/// <summary> /// 获取缓冲区 /// </summary> /// <returns>缓冲区,失败返回null</returns> public override PointerStruct TryGet() { var buffer = new PointerStruct(); InterlockedPlus.NoCheckCompareSetSleep0(ref _bufferLock); foreach (var data in _buffers) { buffer = data; break; } if (buffer.Data != null) _buffers.Remove(buffer); _bufferLock = 0; return buffer; }
/// <summary> /// 保存缓冲区 /// </summary> /// <param name="buffer">缓冲区</param> public override void Push(ref PointerStruct buffer) { var data = buffer.Data; buffer.Data = null; if (data != null) { bool isAdd, isMax = false; InterlockedPlus.NoCheckCompareSetSleep0(ref _bufferLock); try { if ((isAdd = _buffers.Add(new PointerStruct {Data = data})) && (isMax = _buffers.Count > _maxCount)) { _maxCount <<= 1; } } finally { _bufferLock = 0; } if (isAdd) { if (isMax) { LogPlus.Default.Add("非托管内存池扩展实例数量 byte*(" + Size + ")[" + _buffers.Count + "]"); } } else LogPlus.Error.Add("内存池释放冲突 " + Size, true); } }
/// <summary> /// 保存缓冲区 /// </summary> /// <param name="buffer">缓冲区</param> public override void Push(ref PointerStruct buffer) { var data = buffer.Data; buffer.Data = null; if (data != null) _pool.Push(new PointerStruct {Data = data}); }
/// <summary> /// 保存缓冲区 /// </summary> /// <param name="buffer">缓冲区</param> public abstract void Push(ref PointerStruct buffer);
/// <summary> /// 释放内存 /// </summary> /// <param name="data">非托管内存起始指针</param> public static void Free(ref PointerStruct data) { if (data.Data != null) { Interlocked.Decrement(ref _usedCount); Marshal.FreeHGlobal((IntPtr) data.Data); data.Data = null; } }
static NumberPlus() { _deBruijn32 = GetDeBruijn32(); }
static DatePlus() { var dataIndex = 0; var datas = UnmanagedPlus.Get(false, 7 * sizeof(int), 12 * sizeof(int)); WeekData = datas[dataIndex++]; MonthData = datas[dataIndex++]; var write = WeekData.Int; *write = 'S' + ('u' << 8) + ('n' << 16) + (',' << 24); *++write = 'M' + ('o' << 8) + ('n' << 16) + (',' << 24); *++write = 'T' + ('u' << 8) + ('e' << 16) + (',' << 24); *++write = 'W' + ('e' << 8) + ('d' << 16) + (',' << 24); *++write = 'T' + ('h' << 8) + ('u' << 16) + (',' << 24); *++write = 'F' + ('r' << 8) + ('i' << 16) + (',' << 24); *++write = 'S' + ('a' << 8) + ('t' << 16) + (',' << 24); write = MonthData.Int; *write = 'J' + ('a' << 8) + ('n' << 16) + (' ' << 24); *++write = 'F' + ('e' << 8) + ('b' << 16) + (' ' << 24); *++write = 'M' + ('a' << 8) + ('r' << 16) + (' ' << 24); *++write = 'A' + ('p' << 8) + ('r' << 16) + (' ' << 24); *++write = 'M' + ('a' << 8) + ('y' << 16) + (' ' << 24); *++write = 'J' + ('u' << 8) + ('n' << 16) + (' ' << 24); *++write = 'J' + ('u' << 8) + ('l' << 16) + (' ' << 24); *++write = 'A' + ('u' << 8) + ('g' << 16) + (' ' << 24); *++write = 'S' + ('e' << 8) + ('p' << 16) + (' ' << 24); *++write = 'O' + ('c' << 8) + ('t' << 16) + (' ' << 24); *++write = 'N' + ('o' << 8) + ('v' << 16) + (' ' << 24); *++write = 'D' + ('e' << 8) + ('c' << 16) + (' ' << 24); }
public void ParseLoopRefNameOffset() { // Modify name segment length to exceed packet data end // offset 36, 0xC0, -> pointer, offset 0 << 8 + data[37] // offset 37, 0x0C, -> begining of name in header, 'china' // modify offset as 24, so that offset + length >= data size, i.e. 36 byte[] byteData = udpPackets[2].PayloadData; Assert.IsTrue(0xC0 == byteData[36]); Assert.IsTrue(0x0C == byteData[37]); byteData[36] = 0xC0; byteData[37] = 36; //try { DnsPacket dnsPacket = new DnsPacket(new KaitaiStream(byteData)); DnsPacket.Query q = dnsPacket.Body.Queries[0]; VerifyName(q.Name.Name, StrQueryDomainName); DnsPacket.Answer a = dnsPacket.Body.Answers[0]; Assert.IsTrue(DnsPacket.ClassType.InClass == a.AnswerClass); Assert.IsTrue(600 == a.Ttl); Assert.IsTrue(DnsPacket.TypeType.A == a.Type); //VerifyRefName(a.Name.Name); { Assert.AreEqual((int)1, a.Name.Name.Count); Label l = a.Name.Name[0]; Assert.IsTrue(l.IsPointer); Assert.IsTrue(0xC0 == l.Length); Assert.IsTrue(36 == l.Pointer.Value); PointerStruct ps = l.Pointer; try { //VerifyName(ps.Contents.Name, StrQueryDomainName); Assert.AreEqual(1, ps.Contents.Name.Count); Label l2 = ps.Contents.Name[0]; Assert.AreEqual(true, l2.IsPointer); Assert.AreEqual(0xC0, l2.Length); Assert.AreEqual((byte)36, l2.Pointer.Value); } catch (Exception) { Assert.Fail(); } // Try to get full name will cause exception try { Assert.AreEqual(a.Name.GetFullName(), ""); Assert.Fail("Exception expected"); } catch (ArgumentOutOfRangeException e) { Console.WriteLine("Exception expected in detecting ref loop: {0}", e.Message); } } } //catch (System.IO.EndOfStreamException) { Assert.IsTrue(true); } return; }
/// <summary> /// 指针位图 /// </summary> /// <param name="map">位图指针,不能为null</param> public FixedMapStruct(PointerStruct map) { _map = map.Byte; }
/// <summary> /// 批量申请非托管内存 /// </summary> /// <param name="isClear">是否需要清除</param> /// <param name="sizes">内存字节数集合</param> /// <returns>非托管内存起始指针</returns> public static PointerStruct[] Get(bool isClear, params int[] sizes) { if (sizes.Length != 0) { var sum = 0; foreach (var size in sizes) { if (size < 0) LogPlus.Error.Throw(LogPlus.ExceptionTypeEnum.IndexOutOfRange); checked { sum += size; } } var pointer = Get(sum, isClear); var data = pointer.Byte; if (data != null) { var index = 0; var datas = new PointerStruct[sizes.Length]; foreach (var size in sizes) { datas[index++] = new PointerStruct {Data = data}; data += size; } return datas; } } return null; }
/// <summary> /// 初始化ASCII位图 /// </summary> /// <param name="map">位图指针</param> /// <param name="value">初始值集合</param> /// <param name="isUnsafe">初始值是否安全</param> public AsciiMapStruct(PointerStruct map, string value, bool isUnsafe = true) : this(map.Byte, value, isUnsafe) { }