// Read an enum type public bool TryGetField(FieldDecl fieldDecl, out byte value) { FieldDefinition fieldDefinition = GetFieldDefinition(fieldDecl); if (fieldDefinition != null && fieldDefinition.FieldType == 0x00) { value = _binaryReader.ReadByte(); if (value == 0xff) { return(false); } else { return(true); } } else { value = 0xff; return(false); } }
public bool TryGetField(FieldDecl fieldDecl, out double value) { value = 0; FieldDefinition fieldDefinition = GetFieldDefinition(fieldDecl); if (fieldDefinition == null) { return(false); } else { // We will return false if we encounter an invalid value in the raw data. // The caller needs to interpret invalid values the same as missing values. if (fieldDefinition.FieldType == 0x01) { sbyte raw = _binaryReader.ReadSByte(); if (raw == 0x7f) { return(false); } value = Convert.ToDouble(raw); } else if (fieldDefinition.FieldType == 0x02 || fieldDefinition.FieldType == 0x0A) { byte raw = _binaryReader.ReadByte(); if (raw == 0xff) { return(false); } value = Convert.ToDouble(raw); } else if (fieldDefinition.FieldType == 0x83) { Int16 raw = _binaryReader.ReadInt16(); if (raw == 0x7fff) { return(false); } value = Convert.ToDouble(raw); } else if (fieldDefinition.FieldType == 0x84 || fieldDefinition.FieldType == 0x8B) { UInt16 raw = _binaryReader.ReadUInt16(); if (raw == 0xffff) { return(false); } value = Convert.ToDouble(raw); } else if (fieldDefinition.FieldType == 0x85) { Int32 raw = _binaryReader.ReadInt32(); if (raw == 0x7fffffff) { return(false); } value = Convert.ToDouble(raw); } else if (fieldDefinition.FieldType == 0x86 || fieldDefinition.FieldType == 0x8C) { UInt32 raw = _binaryReader.ReadUInt32(); if (raw == 0xffffffff) { return(false); } value = Convert.ToDouble(raw); } else if (fieldDefinition.FieldType == 0x88) { // TODO: don't know how to handle floating point invalid values. // I think I need to peek the raw bits rather than try to interpret value = Convert.ToDouble(_binaryReader.ReadSingle()); } else if (fieldDefinition.FieldType == 0x89) { // TODO: don't know how to handle floating point invalid values // I think I need to peek the raw bits rather than try to interpret value = Convert.ToDouble(_binaryReader.ReadDouble()); } else { value = 0; return(false); } return(true); } }