public DataRow parseRow(int id, ref RandomAccess ra) { DataRow retRow = _tableDT.NewRow(); retRow["ID"] = id; for (int t = 0; t < _fields.Count; t++) { TableField field = _fields[t]; if (field.isArray()) { object[] arr = new object[field.Elements]; int fieldSize = field.Length / arr.Length; for (int y = 0; y < arr.Length; y++) { arr[y] = parseField(field.FieldType, field.Offset + 9 + fieldSize * y, fieldSize, field, ra); } retRow[field.FieldName] = arr; } else { retRow[field.FieldName] = parseField(field.FieldType, field.Offset + 9, field.Length, field, ra); } } return(retRow); }
public object parseField(int type, int ofs, int len, TableField field, RandomAccess ra) { ra.jumpAbs(ofs); switch (type) { case 1: // byte assertEqual(1, len); return(ra.leByte()); case 2: // short assertEqual(2, len); return(ra.leShort()); case 3: // unsigned short assertEqual(2, len); return(ra.leUShort()); case 4: // Date, mask encoded. long date = ra.leULong(); if (date != 0) { long years = (date & 0xFFFF0000) >> 16; long months = (date & 0x0000FF00) >> 8; long days = (date & 0x000000FF); return(new DateTime((int)years, (int)months, (int)days)); } else { return(null); } case 5: // // Time, mask encoded. // So far i've only had values with hours and minutes // but no seconds or milliseconds so I've no way of // knowing how to decode these. // //TODO: Fix the time here based on decaseconds int time = ra.leLong(); int mins = (time & 0x00FF0000) >> 16; int hours = (time & 0x7F000000) >> 24; // return(hours + " " + mins); // case 6: // Long assertEqual(4, len); return(ra.leLong()); case 7: // Unsigned Long assertEqual(4, len); return(ra.leULong()); case 8: // Float assertEqual(4, len); return(ra.leFloat()); case 9: // Double assertEqual(8, len); return(ra.leDouble()); case 0x0A: // BCD encoded. return(ra.binaryCodedDecimal(len, field.BcdLengthOfElement, field.BcdDigitsAfterDecimalPoint)); case 0x12: // Fixed Length String return(ra.fixedLengthString(len)); case 0x13: return(ra.zeroTerminatedString()); case 0x14: return(ra.pascalString()); case 0x16: // Group (an overlay on top of existing data, can be anything). return(ra.leBytes(len)); default: throw new Exception("Unsupported type " + type + " (" + len + ")"); } }
/** * checks if this field fits in the given group field. * @param group the group field. * @return true if it fits. */ public bool isInGroup(TableField group) { return((group.Offset <= _offset) && ((group.Offset + group.Length) >= (_offset + _length))); }