/// <summary>read a null terminated string from a LittleEndianDataInputStream</summary> /// <exception cref="System.IO.IOException"/> public static string ReadString(LittleEndianDataInputStream littleEndianDataInputStream ) { StringBuilder stringBuilder = new StringBuilder(); int c = littleEndianDataInputStream.ReadUnsignedByte(); while (c != 0) { stringBuilder.Append((char)c); c = littleEndianDataInputStream.ReadUnsignedByte(); } return(stringBuilder.ToString()); }
/// <summary>read (little endian)</summary> /// <exception cref="Com.Khubla.Pdxreader.Api.PDXReaderException"/> public virtual void Read(LittleEndianDataInputStream littleEndianDataInputStream) { try { /* * The index record length is six greater than the sum of the lengths of the key fields. */ indexRecordLength = littleEndianDataInputStream.ReadUnsignedShort(); headerBlockSize = littleEndianDataInputStream.ReadUnsignedShort(); if (2048 != headerBlockSize) { throw new Exception("headerBlockSize was expected to be 2048, but '" + headerBlockSize + "' was found"); } int fileType = littleEndianDataInputStream.ReadUnsignedByte(); if (1 != fileType) { throw new Exception("PX file type was expected to be 1, but '" + fileType + "' was found" ); } dataBlockSizeCode = littleEndianDataInputStream.ReadUnsignedByte(); if (1 == dataBlockSizeCode) { blockSize = PXFileHeader.BlockSize.oneK; } else { if (2 == dataBlockSizeCode) { blockSize = PXFileHeader.BlockSize.twoK; } else { if (3 == dataBlockSizeCode) { blockSize = PXFileHeader.BlockSize.threeK; } else { if (4 == dataBlockSizeCode) { blockSize = PXFileHeader.BlockSize.fourK; } else { throw new Exception("Unknown block size code '" + dataBlockSizeCode + "'"); } } } } numberRecords = littleEndianDataInputStream.ReadInt(); blocksInUse = littleEndianDataInputStream.ReadUnsignedShort(); totalBlocksInFile = littleEndianDataInputStream.ReadUnsignedShort(); firstDataBlock = littleEndianDataInputStream.ReadUnsignedShort(); if (1 != firstDataBlock) { throw new Exception("firstDataBlock was expected to be 1, but '" + firstDataBlock + "' was found"); } lastDataBlock = littleEndianDataInputStream.ReadUnsignedShort(); indexRootBlock = littleEndianDataInputStream.ReadUnsignedShort(); numberIndexLevels = littleEndianDataInputStream.ReadUnsignedByte(); /* * The number of fields in the index is the same as the number of key fields for the table. */ numberIndexFields = littleEndianDataInputStream.ReadUnsignedByte(); } catch (Exception e) { throw new PDXReaderException("Exception in read", e); } }
/// <summary>types and sizes, 2 bytes per field</summary> /// <exception cref="Com.Khubla.Pdxreader.Api.PDXReaderException"/> public virtual bool ReadFieldTypeAndSize(LittleEndianDataInputStream littleEndianDataInputStream ) { try { type = littleEndianDataInputStream.ReadUnsignedByte(); length = littleEndianDataInputStream.ReadUnsignedByte(); switch (type) { case unchecked ((int)(0x00)): { return(false); } case unchecked ((int)(0x01)): { fieldType = DBTableField.FieldType.A; break; } case unchecked ((int)(0x02)): { fieldType = DBTableField.FieldType.D; if (length != 4) { throw new Exception("Invalid field length '" + length + "' for type '" + type + "'" ); } break; } case unchecked ((int)(0x03)): { fieldType = DBTableField.FieldType.S; if (length != 2) { throw new Exception("Invalid field length '" + length + "' for type '" + type + "'" ); } break; } case unchecked ((int)(0x04)): { fieldType = DBTableField.FieldType.I; if (length != 4) { throw new Exception("Invalid field length '" + length + "' for type '" + type + "'" ); } break; } case unchecked ((int)(0x05)): { fieldType = DBTableField.FieldType.C; if (length != 8) { throw new Exception("Invalid field length '" + length + "' for type '" + type + "'" ); } break; } case unchecked ((int)(0x06)): { fieldType = DBTableField.FieldType.N; if (length != 8) { throw new Exception("Invalid field length '" + length + "' for type '" + type + "'" ); } break; } case unchecked ((int)(0x09)): { fieldType = DBTableField.FieldType.L; if (length != 1) { throw new Exception("Invalid field length '" + length + "' for type '" + type + "'" ); } break; } case unchecked ((int)(0xc)): { fieldType = DBTableField.FieldType.M; break; } case unchecked ((int)(0xd)): { fieldType = DBTableField.FieldType.B; break; } case unchecked ((int)(0xe)): { fieldType = DBTableField.FieldType.E; break; } case unchecked ((int)(0xf)): { fieldType = DBTableField.FieldType.O; break; } case unchecked ((int)(0x10)): { fieldType = DBTableField.FieldType.G; break; } case unchecked ((int)(0x14)): { fieldType = DBTableField.FieldType.T; if (length != 4) { throw new Exception("Invalid field length '" + length + "' for type '" + type + "'" ); } break; } case unchecked ((int)(0x15)): { fieldType = DBTableField.FieldType.Ts; if (length != 8) { throw new Exception("Invalid field length '" + length + "' for type '" + type + "'" ); } break; } case unchecked ((int)(0x16)): { fieldType = DBTableField.FieldType.Auto; break; } case unchecked ((int)(0x17)): { fieldType = DBTableField.FieldType.Bcd; if (length != 17) { throw new Exception("Invalid field length '" + length + "' for type '" + type + "'" ); } break; } case unchecked ((int)(0x18)): { fieldType = DBTableField.FieldType.Bytes; break; } default: { throw new PDXReaderException("Unknown field type '" + type + "'"); } } return(true); } catch (Exception e) { throw new PDXReaderException("Exception in read", e); } }
/// <summary>read (little endian)</summary> /// <exception cref="System.Exception"/> public virtual void Read(LittleEndianDataInputStream littleEndianDataInputStream) { try { recordBufferSize = littleEndianDataInputStream.ReadUnsignedShort(); headerBlockSize = littleEndianDataInputStream.ReadUnsignedShort(); int tableType = littleEndianDataInputStream.ReadUnsignedByte(); if (0 == tableType) { this.tableType = DBTableHeader.TableType.keyed; } else { if (2 == tableType) { this.tableType = DBTableHeader.TableType.unkeyed; } else { throw new Exception("Unknown table type '" + tableType + "'"); } } dataBlockSizeCode = littleEndianDataInputStream.ReadUnsignedByte(); if (1 == dataBlockSizeCode) { blockSize = DBTableHeader.BlockSize.oneK; } else { if (2 == dataBlockSizeCode) { blockSize = DBTableHeader.BlockSize.twoK; } else { if (3 == dataBlockSizeCode) { blockSize = DBTableHeader.BlockSize.threeK; } else { if (4 == dataBlockSizeCode) { blockSize = DBTableHeader.BlockSize.fourK; } else { throw new Exception("Unknown block size code '" + dataBlockSizeCode + "'"); } } } } numberRecords = littleEndianDataInputStream.ReadInt(); blocksInUse = littleEndianDataInputStream.ReadUnsignedShort(); totalBlocksInFile = littleEndianDataInputStream.ReadUnsignedShort(); firstDataBlock = littleEndianDataInputStream.ReadUnsignedShort(); lastDataBlock = littleEndianDataInputStream.ReadUnsignedShort(); littleEndianDataInputStream.SkipBytes(15); // byte 0x21 numberFields = littleEndianDataInputStream.ReadUnsignedByte(); // byte 0x22 littleEndianDataInputStream.SkipBytes(1); // byte 0x23 numberKeyFields = littleEndianDataInputStream.ReadUnsignedByte(); littleEndianDataInputStream.SkipBytes(unchecked ((int)(0x54))); // byte 0x78 ReadFieldTypesAndSizes(littleEndianDataInputStream); // name littleEndianDataInputStream.SkipBytes(20); embeddedFilename = StringUtil.ReadString(littleEndianDataInputStream); /* * skip forward 250 bytes */ int skipBytes = 250; // dumpBytes(skipBytes, littleEndianDataInputStream); littleEndianDataInputStream.SkipBytes(skipBytes); ReadFieldNames(littleEndianDataInputStream); } catch (Exception e) { throw new Exception("Exception in read", e); } }