/// <summary> /// Lee el arreglo de bytes en la posicion dada /// </summary> /// <param name="position"></param> /// <returns></returns> public unsafe byte[] ReadRecord(int position) { Trace.Assert(position >= 0); if (position < HeaderCapacity) { MMRecordStruct *rec = (MMRecordStruct *)(ptrMemAccessor + position); if (rec->length > 0) { byte[] arr = new byte[rec->length]; Marshal.Copy(mmPtr + position + RecordDataOffset, arr, 0, rec->length); return(arr); } } return(null); }
/// <summary> /// Escribe el arreglo de bytes en el bloque /// Valida el tamño de bloque /// Retorna /// </summary> /// <param name="position"></param> /// <param name="value"></param> /// <param name="length"></param> /// <returns> /// La posicion en caso de exito de lo contrario -1 /// </returns> public unsafe int WriteRecord(int position, byte[] value, int length = -1) { Trace.Assert(position >= 0); MMRecordStruct *rec = (MMRecordStruct *)(ptrMemAccessor + position); if (length + RecordDataOffset <= rec->blockSize) { rec->length = length > 0 ? (Int16)length : (Int16)0; if (length > 0) { WriteBytes(position + RecordDataOffset, value, length); } return(position); } return(-1); }
/// <summary> /// Lee todos los punteros (posiciones) de distintos bloques /// Funcion de Bloque /// </summary> /// <param name="initialPosition"></param> /// <returns> /// Lista de todos los punteros de cada bloque /// </returns> public List <int> ReadRecordsPositions(int initialPosition = 512) { var position = initialPosition > 512 ? initialPosition : 512; List <int> values = new List <int>(); while (position < HeaderSize) { unsafe { MMRecordStruct *rec = (MMRecordStruct *)(ptrMemAccessor + position); if (rec->length > 0) { values.Add(position); } position = position + rec->blockSize; } } return(values); }