/// <summary> /// Parses a metadata. /// Metadata consists of a list of properties consisting of /// name and value as size-specified strings. /// </summary> /// <returns>Returns true on success and false on error.</returns> protected bool ParseMetadata(Span <byte> source) { while (source.Length > 1) { int nameLength = source[0]; source = source.Slice(NameLengthSize); if (source.Length < nameLength) { break; } string name = SpanUtility.ToAscii(source.Slice(0, nameLength)); source = source.Slice(nameLength); if (source.Length < ValueLengthSize) { break; } int valueLength = NetworkOrderBitsConverter.ToInt32(source); source = source.Slice(ValueLengthSize); if (source.Length < valueLength) { break; } byte[] value = new byte[valueLength]; source.Slice(0, valueLength).CopyTo(value); source = source.Slice(valueLength); if (name == ZmtpPropertyIdentity && Options.RecvIdentity) { PeerIdentity = value; } else if (name == ZmtpPropertySocketType) { if (!CheckSocketType(Encoding.ASCII.GetString(value))) { return(false); } } else { if (!GetProperty(name, value, valueLength)) { return(false); } } } if (source.Length > 0) { return(false); } return(true); }
private static void RoundTripInt32(int num, params byte[] bytes) { byte[] buffer = NetworkOrderBitsConverter.GetBytes(num); Assert.Equal(4, buffer.Length); Assert.Equal(bytes, buffer); Assert.Equal(num, NetworkOrderBitsConverter.ToInt32(buffer)); NetworkOrderBitsConverter.PutInt32(num, buffer); Assert.Equal(bytes, buffer); Assert.Equal(num, NetworkOrderBitsConverter.ToInt32(buffer)); }
public void TestInt64() { byte[] buffer = NetworkOrderBitsConverter.GetBytes(1); Assert.AreEqual(1, buffer[3]); Assert.AreEqual(0, buffer[0]); long num = NetworkOrderBitsConverter.ToInt32(buffer); Assert.AreEqual(1, num); NetworkOrderBitsConverter.PutInt32(16777216, buffer, 0); Assert.AreEqual(1, buffer[0]); Assert.AreEqual(0, buffer[3]); num = NetworkOrderBitsConverter.ToInt32(buffer); Assert.AreEqual(16777216, num); }
/// <summary> /// Parses a metadata. /// Metadata consists of a list of properties consisting of /// name and value as size-specified strings. /// </summary> /// <returns>Returns true on success and false on error.</returns> protected bool ParseMetadata(byte[] source, int offset, int length) { int bytesLeft = length; while (bytesLeft > 1) { int nameLength = source[offset]; offset += NameLengthSize; bytesLeft -= NameLengthSize; if (bytesLeft < nameLength) { break; } string name = Encoding.ASCII.GetString(source, offset, nameLength); offset += nameLength; bytesLeft -= nameLength; if (bytesLeft < ValueLengthSize) { break; } int valueLength = NetworkOrderBitsConverter.ToInt32(source, offset); offset += ValueLengthSize; bytesLeft -= ValueLengthSize; if (bytesLeft < valueLength) { break; } byte[] value = new byte[valueLength]; Buffer.BlockCopy(source, offset, value, 0, valueLength); offset += valueLength; bytesLeft -= valueLength; if (name == ZmtpPropertyIdentity && Options.RecvIdentity) { PeerIdentity = value; } else if (name == ZmtpPropertySocketType) { if (!CheckSocketType(Encoding.ASCII.GetString(value))) { return(false); } } else { if (!GetProperty(name, value, valueLength)) { return(false); } } } if (bytesLeft > 0) { return(false); } return(true); }