/// <summary> /// Translates the given <see cref="IdxDataType"/> to a .NET <see cref="Type"/>. /// </summary> /// /// <param name="type">The type to be translated.</param> /// /// <returns> /// A .NET <see cref="Type"/> that represents the <see cref="IdxDataType"/>. /// </returns> /// public static Type Translate(IdxDataType type) { switch (type) { case IdxDataType.UnsignedByte: return(typeof(byte)); case IdxDataType.SignedByte: return(typeof(sbyte)); case IdxDataType.Short: return(typeof(short)); case IdxDataType.Integer: return(typeof(int)); case IdxDataType.Float: return(typeof(float)); case IdxDataType.Double: return(typeof(double)); } throw new ArgumentOutOfRangeException("type"); }
public static void Write(string fileName, byte[] data, int samples, IdxDataType dataType, int dimensionsCount, int[] dimensions) { using (FileStream writer = new FileStream(fileName, FileMode.Create, FileAccess.Write)) { WriteHead(writer, samples, dataType, dimensionsCount, dimensions); writer.Write(data, 0, data.Length); } }
private static void WriteHead(FileStream writer, int samples, IdxDataType dataType, int dimensionsCount, int[] dimensions) { writer.Write(BitConverter.GetBytes(GenMagicNumber(dataType, dimensionsCount)), 0, 4); writer.Write(BitConverter.GetBytes(Utils.ChangeEndian(samples)), 0, 4); foreach (int dimension in dimensions) { writer.Write(BitConverter.GetBytes(Utils.ChangeEndian(dimension)), 0, 4); } }
public static void Write(string fileName, List <byte[]> data, int samples, IdxDataType dataType, int dimensionsCount, int[] dimensions) { using (FileStream writer = new FileStream(fileName, FileMode.Create, FileAccess.Write)) { WriteHead(writer, samples, dataType, dimensionsCount, dimensions); foreach (byte[] sample in data) { writer.Write(sample, 0, sample.Length); } } }
public IdxReader(string fileName, bool isGzip = false) { using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { Stream sourceStream = fs; if (isGzip) { GZipStream gzip = new GZipStream(fs, CompressionMode.Decompress); sourceStream = gzip; } byte[] buffer = new byte[4]; sourceStream.Read(buffer, 0, 4); try { dataType = (IdxDataType)buffer[2]; } catch { throw new NotAValidDataTypeException("Data type byte does not represent a known data type."); } int dimCount = buffer[3] - 1; dimensions = new int[dimCount]; magicNumber = Utils.IntFromBytesBigEndian(buffer); sourceStream.Read(buffer, 0, 4); samples = Utils.IntFromBytesBigEndian(buffer); for (int i = 0; i < dimCount; ++i) { sourceStream.Read(buffer, 0, 4); dimensions[i] = Utils.IntFromBytesBigEndian(buffer); } //read data int sampleValuesCount = 1; foreach (int dim in dimensions) { sampleValuesCount *= dim; } int sampleSizeInBytes = sampleValuesCount * Utils.BytesPerDataType[dataType]; data = new byte[sampleSizeInBytes * samples]; try { sourceStream.Read(data, 0, data.Length); } catch { throw new MismatchingFileSizeException($"Couldn't read data. Number of data bytes expected:{data.Length}"); } sourceStream.Dispose(); } }
private Type GetTypeFromIdxType(IdxDataType idxType) { switch (idxType) { case IdxDataType.UByte: case IdxDataType.SByte: return(typeof(byte)); case IdxDataType.Short: return(typeof(short)); case IdxDataType.Int: return(typeof(int)); case IdxDataType.Float: return(typeof(float)); default: return(typeof(double)); } }
private static int GenMagicNumber(IdxDataType dataType, int dimensionsCount) { int magicNumber = (dimensionsCount << 24) | ((byte)dataType << 16); return(magicNumber); }