private static byte[] GetOptioanField(SAMOptionalField field)
{
int valueSize = GetOptionalFieldValueSize(field);
if (valueSize == 0)
{
string message = string.Format(CultureInfo.InvariantCulture, Properties.Resource.BAM_InvalidIntValueInOptField, field.Value, field.Tag);
throw new FormatException(message);
}
int arrayLen = valueSize < 0 ? -valueSize : valueSize;
arrayLen += 3;
byte[] array = new byte[arrayLen];
array[0] = (byte)field.Tag[0];
array[1] = (byte)field.Tag[1];
array[2] = (byte)field.VType[0];
byte[] temparray = new byte[4];
switch (field.VType)
{
case "A": // Printable character
array[3] = (byte)field.Value[0];
break;
case "c": //signed 8-bit integer
case "C": //unsigned 8-bit integer
case "s": // signed 16 bit integer
case "S"://unsinged 16 bit integer
case "i": // signed 32 bit integer
case "I": // unsigned 32 bit integer
if (valueSize == 1)
{
array[2] = (byte)'C';
array[3] = byte.Parse(field.Value, CultureInfo.InvariantCulture);
}
else if (valueSize == -1)
{
sbyte sb = sbyte.Parse(field.Value, CultureInfo.InvariantCulture);
array[2] = (byte)'c';
array[3] = (byte)sb;
}
else if (valueSize == 2)
{
UInt16 uint16value = UInt16.Parse(field.Value, CultureInfo.InvariantCulture);
temparray = Helper.GetLittleEndianByteArray(uint16value);
array[2] = (byte)'S';
array[3] = temparray[0];
array[4] = temparray[1];
}
else if (valueSize == -2)
{
Int16 int16value = Int16.Parse(field.Value, CultureInfo.InvariantCulture);
temparray = Helper.GetLittleEndianByteArray(int16value);
array[2] = (byte)'s';
array[3] = temparray[0];
array[4] = temparray[1];
}
else if (valueSize == 4)
{
uint uint32value = uint.Parse(field.Value, CultureInfo.InvariantCulture);
temparray = Helper.GetLittleEndianByteArray(uint32value);
array[2] = (byte)'I';
array[3] = temparray[0];
array[4] = temparray[1];
array[5] = temparray[2];
array[6] = temparray[3];
}
else
{
int int32value = int.Parse(field.Value, CultureInfo.InvariantCulture);
temparray = Helper.GetLittleEndianByteArray(int32value);
array[2] = (byte)'i';
array[3] = temparray[0];
array[4] = temparray[1];
array[5] = temparray[2];
array[6] = temparray[3];
}
break;
case "f": // float
float floatvalue = float.Parse(field.Value, CultureInfo.InvariantCulture);
temparray = Helper.GetLittleEndianByteArray(floatvalue);
array[3] = temparray[0];
array[4] = temparray[1];
array[5] = temparray[2];
array[6] = temparray[3];
break;
case "Z": // printable string
temparray = Encoding.UTF8.GetBytes(field.Value);
temparray.CopyTo(array, 3);
array[3 + temparray.Length] = (byte)'\0';
break;
case "H": // HexString
temparray = Encoding.UTF8.GetBytes(field.Value);
temparray.CopyTo(array, 3);
array[3 + temparray.Length] = (byte)'\0';
break;
case "B": // integer or numeric array.
UpdateArrayType(array, field);
break;
default:
throw new Exception(Properties.Resource.BAM_InvalidOptValType);
}
return array;
}