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)); }
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); }