public override int Parse(byte[] data, int offset)
{
base.Parse(data, offset);
Encoding encoder=null;
if(data[offset]==0xff && data[offset+1]==0xfe)
{
encoder=Encoding.Unicode;
}
else if(data[offset]==0xfe && data[offset+1]==0xff)
{
encoder=Encoding.BigEndianUnicode;
}
else
{
throw new FieldParsingException(this.GetType(), "Invalid Unicode text field: incorrect BOM character.");
}
if(this.IsNullTerminated)
{
int nullTerminator=-1;
for(int i = offset+2;i < data.Length-1;i+=2)
{
if(data[i]==0 && data[i+1]==0)
{
nullTerminator=i;
break;
}
}
if(nullTerminator==-1 || nullTerminator>=data.Length) // null-terminator was not found.
{
throw new FieldParsingException(this.GetType(), "Invalid Unicode text field: not null terminated.");
}
this.Text=encoder.GetString(data, offset+2, nullTerminator-offset-2);
return nullTerminator-offset+2;
}
else
{
this.Text=encoder.GetString(data, offset+2, data.Length-offset-2);
int nullTerminator=this.Text.IndexOf('\0');
if(nullTerminator!=-1)
{
this.Text=this.Text.Substring(0, nullTerminator);
}
return data.Length-offset;
}
}