public static byte[] EncodeSegmentInfoMessage(SEGMENT_INFO_MESSAGE segmentInfoMsg)
{
List<byte> list = new List<byte>();
// Encode MESSAGE_HEADER
list.Add(segmentInfoMsg.MsgHeader.MinorVersion);
list.Add(segmentInfoMsg.MsgHeader.MajorVersion);
list.AddRange(GetBytesFromUshort((ushort)segmentInfoMsg.MsgHeader.MsgType, false));
if (segmentInfoMsg.MsgHeader.Padding == null)
{
segmentInfoMsg.MsgHeader.Padding = new byte[4];
}
list.AddRange(segmentInfoMsg.MsgHeader.Padding);
// Encode CONNECTION_INFORMATION
list.AddRange(GetBytesFromUint16(segmentInfoMsg.ConnectionInfo.Port, false));
if (segmentInfoMsg.ConnectionInfo.Padding == null)
{
segmentInfoMsg.ConnectionInfo.Padding = new byte[6];
}
list.AddRange(segmentInfoMsg.ConnectionInfo.Padding);
// Encode CONTENT_TAG
list.AddRange(segmentInfoMsg.ContentTag);
// Encode segment infomation.
list.AddRange(GetBytesFromUshort(segmentInfoMsg.SegmentInfo.Version, true));
list.AddRange(GetBytesFromUint((uint)segmentInfoMsg.SegmentInfo.dwHashAlgo, true));
list.AddRange(GetBytesFromUint(segmentInfoMsg.SegmentInfo.dwOffsetInFirstSegment, true));
list.AddRange(GetBytesFromUint(segmentInfoMsg.SegmentInfo.dwOffsetInFirstSegment, true));
list.AddRange(GetBytesFromUint(segmentInfoMsg.SegmentInfo.cSegments, true));
for (int i = 0; i < segmentInfoMsg.SegmentInfo.segments.Length; i++)
{
list.AddRange(GetBytesFromUlong(segmentInfoMsg.SegmentInfo.segments[i].ullOffsetInContent, true));
list.AddRange(GetBytesFromUint(segmentInfoMsg.SegmentInfo.segments[i].cbSegment, true));
list.AddRange(GetBytesFromUint(segmentInfoMsg.SegmentInfo.segments[i].cbBlockSize, true));
list.AddRange(segmentInfoMsg.SegmentInfo.segments[i].SegmentHashOfData);
list.AddRange(segmentInfoMsg.SegmentInfo.segments[i].SegmentSecret);
}
for (int j = 0; j < segmentInfoMsg.SegmentInfo.blocks.Length; j++)
{
list.AddRange(GetBytesFromUint(segmentInfoMsg.SegmentInfo.blocks[j].cBlocks, true));
list.AddRange(segmentInfoMsg.SegmentInfo.blocks[j].BlockHashes);
}
return list.ToArray();
}