示例#1
0
        public void Write(Stream outStream, MesgDefinition mesgDef)
        {
            if (mesgDef == null)
            {
                mesgDef = new MesgDefinition(this);
            }

            EndianBinaryWriter bw = new EndianBinaryWriter(outStream, mesgDef.IsBigEndian);

            bw.Write(LocalNum);

            foreach (FieldDefinition fieldDef in mesgDef.GetFields())
            {
                Field field = GetField(fieldDef.Num);
                if (field == null)
                {
                    field = Profile.GetField(this.Num, fieldDef.Num);
                    fields.Add(field);
                }
                // The field could be blank, correctly formed or partially filled
                while (field.GetSize() < fieldDef.Size)
                {
                    field.AddValue(Fit.BaseType[fieldDef.Type & Fit.BaseTypeNumMask].invalidValue);
                }

                for (int i = 0; i < field.GetNumValues(); i++)
                {
                    object value = field.GetRawValue(i);
                    if (value == null)
                    {
                        value = Fit.BaseType[fieldDef.Type & Fit.BaseTypeNumMask].invalidValue;
                    }
                    switch (fieldDef.Type & Fit.BaseTypeNumMask)
                    {
                    case Fit.Enum:
                    case Fit.Byte:
                    case Fit.UInt8:
                    case Fit.UInt8z:
                        bw.Write((byte)value);
                        break;

                    case Fit.SInt8:
                        bw.Write((sbyte)value);
                        break;

                    case Fit.SInt16:
                        bw.Write((short)value);
                        break;

                    case Fit.UInt16:
                    case Fit.UInt16z:
                        bw.Write((ushort)value);
                        break;

                    case Fit.SInt32:
                        bw.Write((int)value);
                        break;

                    case Fit.UInt32:
                    case Fit.UInt32z:
                        bw.Write((uint)value);
                        break;

                    case Fit.Float32:
                        bw.Write((float)value);
                        break;

                    case Fit.Float64:
                        bw.Write((double)value);
                        break;

                    case Fit.String:
                        bw.Write((byte[])value);
                        // Write the null terminator
                        bw.Write((byte)0x00);
                        break;

                    default:
                        break;
                    }
                }
            }
        }
示例#2
0
        public void Write(Stream outStream, MesgDefinition mesgDef)
        {
            if (mesgDef == null)
            {
                mesgDef = new MesgDefinition(this);
            }

            EndianBinaryWriter bw = new EndianBinaryWriter(outStream, mesgDef.IsBigEndian);

            bw.Write(LocalNum);

            foreach (FieldDefinition fieldDef in mesgDef.GetFields())
            {
                Field field = GetField(fieldDef.Num);
                if (null == field)
                {
                    field = Profile.GetField(this.Num, fieldDef.Num);
                    if (null != field)
                    {
                        fields.Add(field);
                    }
                    else
                    {
                        //Field does not exist in profile, continue to next field
                        continue;
                    }
                }
                // The field could be blank, correctly formed or partially filled
                while (field.GetSize() < fieldDef.Size)
                {
                    if ((field.GetNumValues() == 1) && ((fieldDef.Type & Fit.BaseTypeNumMask) == Fit.String))
                    {
                        //Has to be a string.
                        try
                        {
                            byte[]      value = (byte[])field.GetValue();
                            List <byte> temp  = new List <byte>(value);
                            while (temp.Count < fieldDef.Size)
                            {
                                temp.Add(Convert.ToByte(Fit.BaseType[fieldDef.Type & Fit.BaseTypeNumMask].invalidValue));
                            }
                            field.SetValue(temp.ToArray());
                        }
                        catch (Exception) { throw new FitException("Exception occurred while resizing field to match definition."); }
                    }
                    else
                    {
                        field.AddValue(Fit.BaseType[fieldDef.Type & Fit.BaseTypeNumMask].invalidValue);
                    }
                }

                for (int i = 0; i < field.GetNumValues(); i++)
                {
                    object value = field.GetRawValue(i);
                    if (value == null)
                    {
                        value = Fit.BaseType[fieldDef.Type & Fit.BaseTypeNumMask].invalidValue;
                    }
                    switch (fieldDef.Type & Fit.BaseTypeNumMask)
                    {
                    case Fit.Enum:
                    case Fit.Byte:
                    case Fit.UInt8:
                    case Fit.UInt8z:
                        bw.Write((byte)value);
                        break;

                    case Fit.SInt8:
                        bw.Write((sbyte)value);
                        break;

                    case Fit.SInt16:
                        bw.Write((short)value);
                        break;

                    case Fit.UInt16:
                    case Fit.UInt16z:
                        bw.Write((ushort)value);
                        break;

                    case Fit.SInt32:
                        bw.Write((int)value);
                        break;

                    case Fit.UInt32:
                    case Fit.UInt32z:
                        bw.Write((uint)value);
                        break;

                    case Fit.Float32:
                        bw.Write((float)value);
                        break;

                    case Fit.Float64:
                        bw.Write((double)value);
                        break;

                    case Fit.String:
                        bw.Write((byte[])value);
                        // Write the null terminator
                        bw.Write((byte)0x00);
                        break;

                    default:
                        break;
                    }
                }
            }
        }