Exemplo n.º 1
0
        unsafe public static Tuple <FrameHeader, ChannelCollection> LoadTestLabFrame(string path, FileReader reader, FileReadMode readMode)
        {
            TestLabFrameHeader frameHeader = new TestLabFrameHeader();
            ChannelCollection  channels    = new ChannelCollection();

            reader.Position = 8;

            frameHeader.Title     = ReadASCIIString(reader, 61);
            frameHeader.Character = ReadASCIIString(reader, 121);
            frameHeader.Region    = ReadASCIIString(reader, 121);

            try
            {
                frameHeader.Time = DateTime.Parse(ReadASCIIString(reader, 11) + " " + ReadASCIIString(reader, 9));
            }
            catch
            {
                throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
            }


            int numberOfChannels = reader.ReadUInt16();

            reader.Position += 17;

            if (numberOfChannels == 0)
            {
                if (reader.FileSize != 350)
                {
                    throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                }
            }
            else
            {
                long fullSize = 350 + 192 * numberOfChannels;
                if (reader.FileSize < fullSize)
                {
                    throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                }

                for (int i = 0; i != numberOfChannels; ++i)
                {
                    TestLabChannelHeader channelHeader = new TestLabChannelHeader();
                    channelHeader.Name        = ReadASCIIString(reader, 13);
                    channelHeader.Description = ReadASCIIString(reader, 121);
                    channelHeader.Unit        = ReadASCIIString(reader, 13);
                    channelHeader.Offset      = reader.ReadFloat32();
                    channelHeader.Scale       = reader.ReadFloat32();
                    channelHeader.Cutoff      = reader.ReadFloat32();
                    channelHeader.Sampling    = reader.ReadUInt16();
                    channelHeader.Type        = TestLabChannelHeader.Validation((TestLabChannelType)reader.ReadUInt8());
                    channelHeader.DataFormat  = TestLabChannelHeader.Validation((TestLabDataFormat)reader.ReadUInt8());
                    uint channelLength = reader.ReadUInt32();
                    if (channelLength > int.MaxValue)
                    {
                        throw new InvalidOperationException("Файл содержит канал слишеом большой длины.");
                    }
                    Channel channel = new Channel(channelHeader, new Algebra.RealVector((int)channelLength));
                    channels.Add(channel);
                    reader.Position += 25;

                    fullSize += channelLength * TestLabChannelHeader.GetItemSize(channelHeader.DataFormat) + 2;
                }

                if ((readMode & FileReadMode.DisableCheckExceedingFileSize) == 0)
                {
                    if (reader.FileSize != fullSize)
                    {
                        throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                    }
                }
                else
                {
                    if (reader.FileSize < fullSize)
                    {
                        throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                    }
                }

                for (int i = 0; i != numberOfChannels; ++i)
                {
                    Channel channel             = channels[i];
                    TestLabChannelHeader header = (TestLabChannelHeader)channel.Header;
                    int     length      = channel.Length;
                    byte[]  buffer      = reader.ReadBytes(length * TestLabChannelHeader.GetItemSize(header.DataFormat));
                    double  offset      = header.Offset;
                    double  scale       = header.Scale;
                    double *destination = (double *)channel.Vector.Pointer;

                    switch (header.DataFormat)
                    {
                    case TestLabDataFormat.UInt8:
                        fixed(void *pointer = buffer)
                        {
                            byte *source = (byte *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    case TestLabDataFormat.UInt16:
                        fixed(void *pointer = buffer)
                        {
                            ushort *source = (ushort *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    case TestLabDataFormat.UInt32:
                        fixed(void *pointer = buffer)
                        {
                            uint *source = (uint *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    case TestLabDataFormat.Int8:
                        fixed(void *pointer = buffer)
                        {
                            sbyte *source = (sbyte *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    case TestLabDataFormat.Int16:
                        fixed(void *pointer = buffer)
                        {
                            short *source = (short *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    case TestLabDataFormat.Int32:
                        fixed(void *pointer = buffer)
                        {
                            int *source = (int *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    case TestLabDataFormat.Float32:
                        fixed(void *pointer = buffer)
                        {
                            float *source = (float *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    case TestLabDataFormat.Float64:
                        fixed(void *pointer = buffer)
                        {
                            double *source = (double *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    default:
                        throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                    }

                    if (reader.ReadUInt16() != 65535)
                    {
                        throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                    }
                }
            }

            return(new Tuple <FrameHeader, ChannelCollection>(frameHeader, channels));
        }