public int Serialize(byte[] buffer, int offset)
{
byte header = (byte)Type;
header <<= 4;
header |= (byte)(Segmented ? 0x08 : 0x00);
header |= (byte)(MoreFollows ? 0x04 : 0x00);
header |= (byte)(SegmentedResponseAccepted ? 0x02 : 0x00);
buffer[offset++] = header;
MaxSegments maxSegments = MaxSegments.Unspecified;
MaxAppgramLength maxAppgramLength = MaxAppgramLength._50;
if (MaxSegmentsAccepted > 64)
maxSegments = MaxSegments.GreaterThanSixtyFour;
else if (MaxSegmentsAccepted == 64)
maxSegments = MaxSegments.SixtyFour;
else if (MaxSegmentsAccepted >= 32)
maxSegments = MaxSegments.ThirtyTwo;
else if (MaxSegmentsAccepted >= 16)
maxSegments = MaxSegments.Sixteen;
else if (MaxSegmentsAccepted >= 8)
maxSegments = MaxSegments.Eight;
else if (MaxSegmentsAccepted >= 4)
maxSegments = MaxSegments.Four;
else if (MaxSegmentsAccepted >= 2)
maxSegments = MaxSegments.Two;
else
maxSegments = MaxSegments.Unspecified;
if (MaxAppgramLengthAccepted >= 1476)
maxAppgramLength = MaxAppgramLength._1476;
else if (MaxAppgramLengthAccepted >= 1024)
maxAppgramLength = MaxAppgramLength._1024;
else if (MaxAppgramLengthAccepted >= 480)
maxAppgramLength = MaxAppgramLength._480;
else if (MaxAppgramLengthAccepted >= 206)
maxAppgramLength = MaxAppgramLength._206;
else if (MaxAppgramLengthAccepted >= 128)
maxAppgramLength = MaxAppgramLength._128;
else if (MaxAppgramLengthAccepted >= 50)
maxAppgramLength = MaxAppgramLength._50;
else
throw new Exception("MaxAppgramLengthAccepted is small than minimum value");
header = (byte)maxSegments;
header <<= 4;
header |= (byte)maxAppgramLength;
buffer[offset++] = header;
buffer[offset++] = InvokeId;
if(Segmented)
{
buffer[offset++] = SequenceNumber;
buffer[offset++] = ProposedWindowSize;
}
buffer[offset++] = ServiceChoice;
return offset;
}