Exemple #1
0
        public void ChecksumValidationExceptionShouldBeThrownIfChecksumIsWrong(byte[] data, byte checksum)
        {
            var sut = new OffsetRecord()
            {
                Address   = 0x0000,
                ByteCount = 2,
                Data      = data,
                Checksum  = checksum,
                Type      = IntelHexRecordType.ExtendedLinearAddress
            };

            Assert.Throws <ChecksumValidationFailedException>(() => sut.GetBinaryRepresentation(0x0000));
        }
Exemple #2
0
        public void OffsetRecordShouldFillUpTheOffset(byte[] data, byte checksum, long byteLength, long baseAddress)
        {
            var expectedBinaryRepresentation = new byte[byteLength];

            for (var i = 0; i < byteLength; i++)
            {
                expectedBinaryRepresentation[i] = 0xFF;
            }

            var sut = new OffsetRecord()
            {
                Address   = 0x0000,
                ByteCount = 2,
                Data      = data,
                Checksum  = checksum,
                Type      = IntelHexRecordType.ExtendedLinearAddress
            };

            var caluclatedBinaryRepresentation = sut.GetBinaryRepresentation((int)baseAddress);

            Assert.AreEqual(expectedBinaryRepresentation, caluclatedBinaryRepresentation);
        }
        private IEnumerable <int> ReadFromStream(long offset, long length)
        {
            List <int> new_fields = new List <int>();

            StorageStream.Position = offset;
            BinaryReader input = new BinaryReader(StorageStream);               //	no 'using'!!! must NOT close the storage stream

            //	кол-во оффсетов
            byte short_off_count = input.ReadByte();
            int  long_off_count  = 0;

            if (short_off_count >= 0x80)                //	0x80 - признак наличия длинных оффсетов
            {
                short_off_count -= 0x80;
                long_off_count   = input.ReadInt32();
            }

            //	относительные оффсеты в том виде, как они записаны в файле
            Queue <OffsetRecord> offsets = new Queue <OffsetRecord>();

            for (int i = 0; i < short_off_count; ++i)
            {
                OffsetRecord new_offset = new OffsetRecord
                {
                    ID     = input.ReadByte(),
                    Offset = input.ReadByte()
                };
                offsets.Enqueue(new_offset);
            }

            for (int i = 0; i < long_off_count; ++i)
            {
                OffsetRecord new_offset = new OffsetRecord
                {
                    ID     = input.ReadInt32(),
                    Offset = input.ReadInt32()
                };
                offsets.Enqueue(new_offset);
            }

            long data_absolute_offset = input.BaseStream.Position;                      //	относительно начала потока
            long data_relative_offset = data_absolute_offset - offset;                  //	относительно начала фрейма - для расчёта длины последнего поля

            //	при перенесении оффсетов в оффсетмап надо заменить их на абсолютные (в потоке) и добавить длины
            while (offsets.Count > 0)
            {
                OffsetRecord current = offsets.Dequeue();

                long absolute_offset = data_absolute_offset + current.Offset;
                long next_offset     = (offsets.Count > 0) ? offsets.Peek().Offset : length - data_relative_offset;
                long offset_length   = next_offset - current.Offset;

                OffsetMapField field_record = GetOrCreateFieldRecord(current.ID);

                field_record.Offset = absolute_offset;
                field_record.Length = offset_length;
                //field_record.StreamDataIsValid = true;

                new_fields.Add(current.ID);
            }

            return(new_fields);
        }