/// <summary>
/// Initializes <see cref="MetadataRecord"/> from the specified <paramref name="buffer"/>.
/// </summary>
/// <param name="buffer">Binary image to be used for initializing <see cref="MetadataRecord"/>.</param>
/// <param name="startIndex">0-based starting index of initialization data in the <paramref name="buffer"/>.</param>
/// <param name="length">Valid number of bytes in <paramref name="buffer"/> from <paramref name="startIndex"/>.</param>
/// <returns>Number of bytes used from the <paramref name="buffer"/> for initializing <see cref="MetadataRecord"/>.</returns>
public int ParseBinaryImage(byte[] buffer, int startIndex, int length)
{
if (length >= FixedLength)
{
// Binary image has sufficient data.
Remarks = Encoding.ASCII.GetString(buffer, startIndex, 512).Trim();
HardwareInfo = Encoding.ASCII.GetString(buffer, startIndex + 512, 512).Trim();
AlarmEmails = Encoding.ASCII.GetString(buffer, startIndex + 1024, 512).Trim();
Description = Encoding.ASCII.GetString(buffer, startIndex + 1536, 80).Trim();
CurrentData = Encoding.ASCII.GetString(buffer, startIndex + 1616, 80).Trim();
Name = Encoding.ASCII.GetString(buffer, startIndex + 1696, 40).Trim();
Synonym1 = Encoding.ASCII.GetString(buffer, startIndex + 1736, 40).Trim();
Synonym2 = Encoding.ASCII.GetString(buffer, startIndex + 1776, 40).Trim();
Synonym3 = Encoding.ASCII.GetString(buffer, startIndex + 1816, 40).Trim();
AlarmPagers = Encoding.ASCII.GetString(buffer, startIndex + 1856, 40).Trim();
AlarmPhones = Encoding.ASCII.GetString(buffer, startIndex + 1896, 40).Trim();
PlantCode = Encoding.ASCII.GetString(buffer, startIndex + 1936, 24).Trim();
SystemName = Encoding.ASCII.GetString(buffer, startIndex + 1960, 24).Trim();
EmailTime = Encoding.ASCII.GetString(buffer, startIndex + 1984, 40).Trim();
ScanRate = LittleEndian.ToSingle(buffer, startIndex + 2104);
UnitNumber = LittleEndian.ToInt32(buffer, startIndex + 2108);
SecurityFlags.Value = LittleEndian.ToInt32(buffer, startIndex + 2112);
GeneralFlags.Value = LittleEndian.ToInt32(buffer, startIndex + 2116);
AlarmFlags.Value = LittleEndian.ToInt32(buffer, startIndex + 2120);
CompressionMinTime = LittleEndian.ToInt32(buffer, startIndex + 2124);
CompressionMaxTime = LittleEndian.ToInt32(buffer, startIndex + 2128);
SourceID = LittleEndian.ToInt32(buffer, startIndex + 2132);
switch (GeneralFlags.DataType)
{
case DataType.Analog:
m_analogFields.ParseBinaryImage(buffer, startIndex + 2152, length - 2152);
break;
case DataType.Digital:
m_digitalFields.ParseBinaryImage(buffer, startIndex + 2152, length - 2152);
break;
case DataType.Composed:
m_composedFields.ParseBinaryImage(buffer, startIndex + 2152, length - 2152);
break;
case DataType.Constant:
m_constantFields.ParseBinaryImage(buffer, startIndex + 2152, length - 2152);
break;
}
return(FixedLength);
}
// Binary image does not have sufficient data.
return(0);
}