public int ParseBinaryImage(byte[] buffer, int startIndex, int length)
{
int binaryLength;
int offset = startIndex;
int referenceCount;
ushort signalIndex;
Guid signalID;
int sourceSize;
string source;
uint id;
int unauthorizedIDCount;
if ((object)m_encoding == null)
throw new InvalidOperationException("Attempt to parse binary image of signal index cache without setting a character encoding.");
buffer.ValidateParameters(startIndex, length);
if (length < 4)
return 0;
// Byte size of cache
binaryLength = BigEndian.ToInt32(buffer, offset);
offset += 4;
if (length < binaryLength)
return 0;
// We know we have enough data so we can empty the reference cache
m_reference.Clear();
// Subscriber ID
m_subscriberID = EndianOrder.BigEndian.ToGuid(buffer, offset);
offset += 16;
// Number of references
referenceCount = BigEndian.ToInt32(buffer, offset);
offset += 4;
for (int i = 0; i < referenceCount; i++)
{
// Signal index
signalIndex = BigEndian.ToUInt16(buffer, offset);
offset += 2;
// Signal ID
signalID = EndianOrder.BigEndian.ToGuid(buffer, offset);
offset += 16;
// Source
sourceSize = BigEndian.ToInt32(buffer, offset);
offset += 4;
source = m_encoding.GetString(buffer, offset, sourceSize);
offset += sourceSize;
// ID
id = BigEndian.ToUInt32(buffer, offset);
offset += 4;
m_reference[signalIndex] = MeasurementKey.LookUpOrCreate(signalID, source, id);
}
// Number of unauthorized IDs
unauthorizedIDCount = BigEndian.ToInt32(buffer, offset);
m_unauthorizedSignalIDs = new Guid[unauthorizedIDCount];
offset += 4;
for (int i = 0; i < unauthorizedIDCount; i++)
{
// Unauthorized ID
m_unauthorizedSignalIDs[i] = EndianOrder.BigEndian.ToGuid(buffer, offset);
offset += 16;
}
return binaryLength;
}