/// <summary> /// Tries to parse a <see cref="NbNsNodeStatusResponseResourceRecord"/> from a buffer of bytes /// </summary> /// <param name="buffer">Byte array containing the NbNsNodeStatusResponseResourceRecord</param> /// <param name="offset">Zero based offset in the buffer where the NbNsNodeStatusResponseResourceRecord starts</param> /// <param name="resourceRecord">Parsed NbNsNodeStatusResponseResourceRecord if successful, else null</param> /// <returns><c>true</c> if parsing was successful, else <c>false</c></returns> public static bool TryParse(byte[] buffer, int offset, out NbNsNodeStatusResponseResourceRecord resourceRecord) { resourceRecord = null; var result = new NbNsNodeStatusResponseResourceRecord(); if (!result.TryParse(buffer, offset)) { return(false); } if (result.RrType != RrTypeValue.NbStat || result.RrClass != RrClassValue.In) { return(false); } offset += result.RrName.Length + 2 + 2 + 4 + 2; var numNames = buffer[offset]; offset++; if (buffer.Length <= offset + numNames * NbNsNodeName.NODE_NAME_LENGTH + NbNsStatistics.STATISTICS_LENGTH) { return(false); } var nodeNames = new List <NbNsNodeName>(); for (byte i = 0; i < numNames; i++) { NbNsNodeName nodeName; if (!NbNsNodeName.TryParse(buffer, offset, out nodeName)) { return(false); } nodeNames.Add(nodeName); offset += NbNsNodeName.NODE_NAME_LENGTH; } result.NodeNames = nodeNames; NbNsStatistics statistics; if (!NbNsStatistics.TryParse(buffer, offset, out statistics)) { return(false); } result.Statistics = statistics; resourceRecord = result; return(true); }
/// <summary> /// Tries to parse a <see cref="NbNsNodeStatusResponse"/> from a buffer of bytes starting after <see cref="NbNsHeader.NETBIOS_HEADER_LENGTH"/> bytes /// </summary> /// <param name="header"><see cref="NbNsHeader"/> already parsed from the beginning of <see cref="buffer"/></param> /// <param name="buffer">Byte array containing the NbNsNodeStatusResponse</param> /// <param name="result">Parsed NbNsNodeStatusResponse if successful, else null</param> /// <returns><c>true</c> if parsing was successful, else <c>false</c></returns> /// <remarks> /// This method is only called from <see cref="NbNsPacketBase.TryParse"/>. /// </remarks> internal static bool TryParse(NbNsHeader header, byte[] buffer, out NbNsNodeStatusResponse result) { result = null; NbNsNodeStatusResponseResourceRecord rr; if (!NbNsNodeStatusResponseResourceRecord.TryParse(buffer, NbNsHeader.NETBIOS_HEADER_LENGTH, out rr)) { return(false); } result = new NbNsNodeStatusResponse(header, rr); return(true); }
/// <summary> /// Tries to parse a <see cref="NbNsNodeStatusResponseResourceRecord"/> from a buffer of bytes /// </summary> /// <param name="buffer">Byte array containing the NbNsNodeStatusResponseResourceRecord</param> /// <param name="offset">Zero based offset in the buffer where the NbNsNodeStatusResponseResourceRecord starts</param> /// <param name="resourceRecord">Parsed NbNsNodeStatusResponseResourceRecord if successful, else null</param> /// <returns><c>true</c> if parsing was successful, else <c>false</c></returns> public static bool TryParse(byte[] buffer, int offset, out NbNsNodeStatusResponseResourceRecord resourceRecord) { resourceRecord = null; var result = new NbNsNodeStatusResponseResourceRecord(); if (!result.TryParse(buffer, offset)) return false; if (result.RrType != RrTypeValue.NbStat || result.RrClass != RrClassValue.In) return false; offset += result.RrName.Length + 2 + 2 + 4 + 2; var numNames = buffer[offset]; offset++; if (buffer.Length <= offset + numNames * NbNsNodeName.NODE_NAME_LENGTH + NbNsStatistics.STATISTICS_LENGTH) return false; var nodeNames = new List<NbNsNodeName>(); for (byte i = 0; i < numNames; i++) { NbNsNodeName nodeName; if (!NbNsNodeName.TryParse(buffer, offset, out nodeName)) return false; nodeNames.Add(nodeName); offset += NbNsNodeName.NODE_NAME_LENGTH; } result.NodeNames = nodeNames; NbNsStatistics statistics; if (!NbNsStatistics.TryParse(buffer, offset, out statistics)) return false; result.Statistics = statistics; resourceRecord = result; return true; }