Ejemplo 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));
        }
Ejemplo n.º 2
0
        unsafe public static string ReadASCIIString(FileReader reader, int length)
        {
            StringBuilder text = new StringBuilder();

            fixed(byte *bytes = reader.ReadBytes(length))
            {
                int index = 0;

                while (index < length && bytes[index] != 0)
                {
                    switch (bytes[index])
                    {
                    case 0x20: text.Append(' '); break;

                    case 0x21: text.Append('!'); break;

                    case 0x22: text.Append('\"'); break;

                    case 0x23: text.Append('#'); break;

                    case 0x24: text.Append('$'); break;

                    case 0x25: text.Append('%'); break;

                    case 0x26: text.Append('&'); break;

                    case 0x27: text.Append('\''); break;

                    case 0x28: text.Append('('); break;

                    case 0x29: text.Append(')'); break;

                    case 0x2A: text.Append('*'); break;

                    case 0x2B: text.Append('+'); break;

                    case 0x2C: text.Append(','); break;

                    case 0x2D: text.Append('-'); break;

                    case 0x2E: text.Append('.'); break;

                    case 0x2F: text.Append('/'); break;

                    case 0x30: text.Append('0'); break;

                    case 0x31: text.Append('1'); break;

                    case 0x32: text.Append('2'); break;

                    case 0x33: text.Append('3'); break;

                    case 0x34: text.Append('4'); break;

                    case 0x35: text.Append('5'); break;

                    case 0x36: text.Append('6'); break;

                    case 0x37: text.Append('7'); break;

                    case 0x38: text.Append('8'); break;

                    case 0x39: text.Append('9'); break;

                    case 0x3A: text.Append(':'); break;

                    case 0x3B: text.Append(';'); break;

                    case 0x3C: text.Append('<'); break;

                    case 0x3D: text.Append('='); break;

                    case 0x3E: text.Append('>'); break;

                    case 0x3F: text.Append('?'); break;

                    case 0x40: text.Append('@'); break;

                    case 0x41: text.Append('A'); break;

                    case 0x42: text.Append('B'); break;

                    case 0x43: text.Append('C'); break;

                    case 0x44: text.Append('D'); break;

                    case 0x45: text.Append('E'); break;

                    case 0x46: text.Append('F'); break;

                    case 0x47: text.Append('G'); break;

                    case 0x48: text.Append('H'); break;

                    case 0x49: text.Append('I'); break;

                    case 0x4A: text.Append('J'); break;

                    case 0x4B: text.Append('K'); break;

                    case 0x4C: text.Append('L'); break;

                    case 0x4D: text.Append('M'); break;

                    case 0x4E: text.Append('N'); break;

                    case 0x4F: text.Append('O'); break;

                    case 0x50: text.Append('P'); break;

                    case 0x51: text.Append('Q'); break;

                    case 0x52: text.Append('R'); break;

                    case 0x53: text.Append('S'); break;

                    case 0x54: text.Append('T'); break;

                    case 0x55: text.Append('U'); break;

                    case 0x56: text.Append('V'); break;

                    case 0x57: text.Append('W'); break;

                    case 0x58: text.Append('X'); break;

                    case 0x59: text.Append('Y'); break;

                    case 0x5A: text.Append('Z'); break;

                    case 0x5B: text.Append('['); break;

                    case 0x5C: text.Append('\\'); break;

                    case 0x5D: text.Append(']'); break;

                    case 0x5E: text.Append('^'); break;

                    case 0x5F: text.Append('_'); break;

                    case 0x60: text.Append('`'); break;

                    case 0x61: text.Append('a'); break;

                    case 0x62: text.Append('b'); break;

                    case 0x63: text.Append('c'); break;

                    case 0x64: text.Append('d'); break;

                    case 0x65: text.Append('e'); break;

                    case 0x66: text.Append('f'); break;

                    case 0x67: text.Append('g'); break;

                    case 0x68: text.Append('h'); break;

                    case 0x69: text.Append('i'); break;

                    case 0x6A: text.Append('j'); break;

                    case 0x6B: text.Append('k'); break;

                    case 0x6C: text.Append('l'); break;

                    case 0x6D: text.Append('m'); break;

                    case 0x6E: text.Append('n'); break;

                    case 0x6F: text.Append('o'); break;

                    case 0x70: text.Append('p'); break;

                    case 0x71: text.Append('q'); break;

                    case 0x72: text.Append('r'); break;

                    case 0x73: text.Append('s'); break;

                    case 0x74: text.Append('t'); break;

                    case 0x75: text.Append('u'); break;

                    case 0x76: text.Append('v'); break;

                    case 0x77: text.Append('w'); break;

                    case 0x78: text.Append('x'); break;

                    case 0x79: text.Append('y'); break;

                    case 0x7A: text.Append('z'); break;

                    case 0x7B: text.Append('{'); break;

                    case 0x7C: text.Append('|'); break;

                    case 0x7D: text.Append('}'); break;

                    case 0x7E: text.Append('~'); break;

                    case 0x7F: text.Append(' '); break;

                    case 0x80: text.Append('Ђ'); break;

                    case 0x81: text.Append('Ѓ'); break;

                    case 0x82: text.Append('‚'); break;

                    case 0x83: text.Append('ѓ'); break;

                    case 0x84: text.Append('„'); break;

                    case 0x85: text.Append('…'); break;

                    case 0x86: text.Append('†'); break;

                    case 0x87: text.Append('‡'); break;

                    case 0x88: text.Append('€'); break;

                    case 0x89: text.Append('‰'); break;

                    case 0x8A: text.Append('Љ'); break;

                    case 0x8B: text.Append('‹'); break;

                    case 0x8C: text.Append('Њ'); break;

                    case 0x8D: text.Append('Ќ'); break;

                    case 0x8E: text.Append('Ћ'); break;

                    case 0x8F: text.Append('Џ'); break;

                    case 0x90: text.Append('ђ'); break;

                    case 0x91: text.Append('‘'); break;

                    case 0x92: text.Append('’'); break;

                    case 0x93: text.Append('“'); break;

                    case 0x94: text.Append('”'); break;

                    case 0x95: text.Append('•'); break;

                    case 0x96: text.Append('–'); break;

                    case 0x97: text.Append('—'); break;

                    case 0x98: text.Append(' '); break;

                    case 0x99: text.Append('™'); break;

                    case 0x9A: text.Append('љ'); break;

                    case 0x9B: text.Append('›'); break;

                    case 0x9C: text.Append('њ'); break;

                    case 0x9D: text.Append('ќ'); break;

                    case 0x9E: text.Append('ћ'); break;

                    case 0x9F: text.Append('џ'); break;

                    case 0xA0: text.Append(' '); break;

                    case 0xA1: text.Append('Ў'); break;

                    case 0xA2: text.Append('ў'); break;

                    case 0xA3: text.Append('Ј'); break;

                    case 0xA4: text.Append('¤'); break;

                    case 0xA5: text.Append('Ґ'); break;

                    case 0xA6: text.Append('¦'); break;

                    case 0xA7: text.Append('§'); break;

                    case 0xA8: text.Append('Ё'); break;

                    case 0xA9: text.Append('©'); break;

                    case 0xAA: text.Append('Є'); break;

                    case 0xAB: text.Append('«'); break;

                    case 0xAC: text.Append('¬'); break;

                    case 0xAD: text.Append(' '); break;

                    case 0xAE: text.Append('®'); break;

                    case 0xAF: text.Append('Ї'); break;

                    case 0xB0: text.Append('°'); break;

                    case 0xB1: text.Append('±'); break;

                    case 0xB2: text.Append('І'); break;

                    case 0xB3: text.Append('і'); break;

                    case 0xB4: text.Append('ґ'); break;

                    case 0xB5: text.Append('µ'); break;

                    case 0xB6: text.Append('¶'); break;

                    case 0xB7: text.Append('·'); break;

                    case 0xB8: text.Append('ё'); break;

                    case 0xB9: text.Append('№'); break;

                    case 0xBA: text.Append('є'); break;

                    case 0xBB: text.Append('»'); break;

                    case 0xBC: text.Append('ј'); break;

                    case 0xBD: text.Append('Ѕ'); break;

                    case 0xBE: text.Append('ѕ'); break;

                    case 0xBF: text.Append('ї'); break;

                    case 0xC0: text.Append('А'); break;

                    case 0xC1: text.Append('Б'); break;

                    case 0xC2: text.Append('В'); break;

                    case 0xC3: text.Append('Г'); break;

                    case 0xC4: text.Append('Д'); break;

                    case 0xC5: text.Append('Е'); break;

                    case 0xC6: text.Append('Ж'); break;

                    case 0xC7: text.Append('З'); break;

                    case 0xC8: text.Append('И'); break;

                    case 0xC9: text.Append('Й'); break;

                    case 0xCA: text.Append('К'); break;

                    case 0xCB: text.Append('Л'); break;

                    case 0xCC: text.Append('М'); break;

                    case 0xCD: text.Append('Н'); break;

                    case 0xCE: text.Append('О'); break;

                    case 0xCF: text.Append('П'); break;

                    case 0xD0: text.Append('Р'); break;

                    case 0xD1: text.Append('С'); break;

                    case 0xD2: text.Append('Т'); break;

                    case 0xD3: text.Append('У'); break;

                    case 0xD4: text.Append('Ф'); break;

                    case 0xD5: text.Append('Х'); break;

                    case 0xD6: text.Append('Ц'); break;

                    case 0xD7: text.Append('Ч'); break;

                    case 0xD8: text.Append('Ш'); break;

                    case 0xD9: text.Append('Щ'); break;

                    case 0xDA: text.Append('Ъ'); break;

                    case 0xDB: text.Append('Ы'); break;

                    case 0xDC: text.Append('Ь'); break;

                    case 0xDD: text.Append('Э'); break;

                    case 0xDE: text.Append('Ю'); break;

                    case 0xDF: text.Append('Я'); break;

                    case 0xE0: text.Append('а'); break;

                    case 0xE1: text.Append('б'); break;

                    case 0xE2: text.Append('в'); break;

                    case 0xE3: text.Append('г'); break;

                    case 0xE4: text.Append('д'); break;

                    case 0xE5: text.Append('е'); break;

                    case 0xE6: text.Append('ж'); break;

                    case 0xE7: text.Append('з'); break;

                    case 0xE8: text.Append('и'); break;

                    case 0xE9: text.Append('й'); break;

                    case 0xEA: text.Append('к'); break;

                    case 0xEB: text.Append('л'); break;

                    case 0xEC: text.Append('м'); break;

                    case 0xED: text.Append('н'); break;

                    case 0xEE: text.Append('о'); break;

                    case 0xEF: text.Append('п'); break;

                    case 0xF0: text.Append('р'); break;

                    case 0xF1: text.Append('с'); break;

                    case 0xF2: text.Append('т'); break;

                    case 0xF3: text.Append('у'); break;

                    case 0xF4: text.Append('ф'); break;

                    case 0xF5: text.Append('х'); break;

                    case 0xF6: text.Append('ц'); break;

                    case 0xF7: text.Append('ч'); break;

                    case 0xF8: text.Append('ш'); break;

                    case 0xF9: text.Append('щ'); break;

                    case 0xFA: text.Append('ъ'); break;

                    case 0xFB: text.Append('ы'); break;

                    case 0xFC: text.Append('ь'); break;

                    case 0xFD: text.Append('э'); break;

                    case 0xFE: text.Append('ю'); break;

                    case 0xFF: text.Append('я'); break;

                    default: text.Append(' '); break;
                    }
                    ++index;
                }
            }

            return(text.ToString());
        }