/// <summary> /// Encodes a message object. /// The format looks as follows: 28 bit P2P version, 4 bit message type, 32 bit message ID, 8 bit message command, /// 160 bit senderSocket ID, 16 bit senderSocket TCP port, 16 bit senderSocket UDP port, 160 bit recipientSocket ID, 32 bit content types, 8 bit options. /// In total, the header is of size 58 bytes. /// </summary> /// <param name="buffer">The buffer to encode to.</param> /// <param name="message">The message with the header that will be encoded.</param> public static void EncodeHeader(AlternativeCompositeByteBuf buffer, Message message) { // TODO add log statemet, also in Java version int versionAndType = message.Version << 4 | ((int)message.Type & Utils.Utils.Mask0F); // TODO check if ordinal works buffer.WriteInt(versionAndType); // 4 buffer.WriteInt(message.MessageId); // 8 buffer.WriteByte(message.Command); // 9 buffer.WriteBytes(message.Sender.PeerId.ToByteArray()); // 29 buffer.WriteShort((short)message.Sender.TcpPort); // 31 buffer.WriteShort((short)message.Sender.UdpPort); // 33 buffer.WriteBytes(message.Recipient.PeerId.ToByteArray()); // 53 buffer.WriteInt(EncodeContentTypes(message.ContentTypes)); // 57 buffer.WriteByte((sbyte)(message.Sender.Options << 4 | message.Options)); // 58 // TODO check if works }
/// <summary> /// Encodes a message object. /// The format looks as follows: 28 bit P2P version, 4 bit message type, 32 bit message ID, 8 bit message command, /// 160 bit senderSocket ID, 16 bit senderSocket TCP port, 16 bit senderSocket UDP port, 160 bit recipientSocket ID, 32 bit content types, 8 bit options. /// In total, the header is of size 58 bytes. /// </summary> /// <param name="buffer">The buffer to encode to.</param> /// <param name="message">The message with the header that will be encoded.</param> public static void EncodeHeader(AlternativeCompositeByteBuf buffer, Message message) { // TODO add log statemet, also in Java version int versionAndType = message.Version << 4 | ((int)message.Type & Utils.Utils.Mask0F); // TODO check if ordinal works buffer.WriteInt(versionAndType); // 4 buffer.WriteInt(message.MessageId); // 8 buffer.WriteByte(message.Command); // 9 buffer.WriteBytes(message.Sender.PeerId.ToByteArray()); // 29 buffer.WriteShort((short) message.Sender.TcpPort); // 31 buffer.WriteShort((short) message.Sender.UdpPort); // 33 buffer.WriteBytes(message.Recipient.PeerId.ToByteArray()); // 53 buffer.WriteInt(EncodeContentTypes(message.ContentTypes)); // 57 buffer.WriteByte((sbyte) (message.Sender.Options << 4 | message.Options)); // 58 // TODO check if works }
/// <summary> /// Converts data to a byte buffer. The first two bytes contain the size of this simple bloom filter. Thus, the bloom filter can only be of length 65536. /// </summary> /// <param name="buffer"></param> public void ToByteBuffer(AlternativeCompositeByteBuf buffer) { sbyte[] tmp = BitArray.ToByteArray(); int currentByteArraySize = tmp.Length; buffer.WriteShort((short)(_byteArraySize + SizeHeader)); buffer.WriteInt(ExpectedElements); buffer.WriteBytes(tmp); buffer.WriteZero(_byteArraySize - currentByteArraySize); }
public void TestEncodeShort() { AlternativeCompositeByteBuf buffer = AlternativeCompositeByteBuf.CompBuffer(); buffer.WriteShort(short.MinValue); // -32,768 buffer.WriteShort(-256); buffer.WriteShort(-255); buffer.WriteShort(-128); buffer.WriteShort(-127); buffer.WriteShort(-1); buffer.WriteShort(0); buffer.WriteShort(1); buffer.WriteShort(127); buffer.WriteShort(128); buffer.WriteShort(255); buffer.WriteShort(256); buffer.WriteShort(short.MaxValue); // 32,767 var bytes = InteropUtil.ExtractBytes(buffer); bool interopResult = JarRunner.WriteBytesAndTestInterop(bytes); Assert.IsTrue(interopResult); }