public static HexFileLine Parse(string line) { if (!line.StartsWith(":")) throw new ArgumentException(); var pointer = 1; var cnt = ReadHexByte(ref line, ref pointer); var addr = ReadHexUShort(ref line, ref pointer); var type = (HexFileLineType)ReadHexByte(ref line, ref pointer); var array = new byte[cnt]; for (var i = 0; i < cnt; i++) { array[i] = ReadHexByte(ref line, ref pointer); } var checksum = ReadHexByte(ref line, ref pointer); var res = new HexFileLine { Address = addr, Data = array, Type = type }; if (res.Checksum != checksum) { throw new Exception("checksum mismatch"); } return res; }
private void EnsureLine(int adr) { _line = _hf.Lines.FirstOrDefault(item => item.Type == HexFileLineType.Data && (item.Address >> 4) == (adr >> 4)); if (_line == null) { _line = new HexFileLine { Address = (ushort) _offset, Type = HexFileLineType.Data, Data = new byte[0] }; _newLine = true; } else { _newLine = false; } _currentData = new List<byte>(_line.Data); }
public void WriteTo(HexFile hexFile) { var lines = (Content.Count + 15) / 16; for (var i = 0; i < lines; i++) { var adr = i * 16; var line = new HexFileLine { Address = (ushort)adr, Type = HexFileLineType.Data, Data = Content.Skip(adr).Take(16).ToArray() }; hexFile.Lines.Add(line); } }
private void FlushLine() { if (_line != null && _newLine && _currentData.Count > 0) { _line.Data = _currentData.ToArray(); _hf.Lines.Add(_line); _line = null; _newLine = false; } }