private string FormatByteValueAsSingleNumber(AlignedIORequest rq) { StringBuilder result = new StringBuilder(); result.Append("0x"); for (int i = 0; i < rq.ByteCount; i++) { result.Append($"{rq.Buffer[rq.BufferOffset + rq.ByteCount - i - 1]:x2}"); } return(result.ToString()); }
private void ProcessRequestOutput(ref AlignedIORequest request, string[] output, int firstLine, int lineCount) { if (request.Direction == LiveMemoryIODirection.Write) { string error = null; for (int i = 0; i < lineCount; i++) { if (output[firstLine + 1].StartsWith("Error:")) { error = output[firstLine + 1]; break; } } if (error == null) { request.Complete(request.WordCount, null); } else { request.Complete(0, error); } } else { int bytesDone = 0; for (int i = 0; i < lineCount; i++) { string line = output[firstLine + i]; int idx = line.IndexOf(':'); if (idx == -1) { request.Complete(0, line); return; } if (!ulong.TryParse(line.Substring(0, idx).Trim(), System.Globalization.NumberStyles.HexNumber, null, out var address)) { request.Complete(0, "Invalid address output: " + line); return; } if (address != (request.Address + (uint)bytesDone)) { throw new Exception($"Mismatching address (expected 0x{request.Address + (uint)bytesDone:x8}: {line})"); } while (bytesDone < request.ByteCount) { idx++; while (idx < line.Length && line[idx] == ' ') { idx++; } if (idx >= (line.Length - 2)) { break; } if (!byte.TryParse(line.Substring(idx, 2), System.Globalization.NumberStyles.HexNumber, null, out var byteValue)) { request.Complete(0, "Invalid output: " + line); return; } idx += 2; request.Buffer[request.BufferOffset + bytesDone++] = byteValue; } } if (bytesDone == request.ByteCount || ((request.Direction == LiveMemoryIODirection.PartialRead) && bytesDone > 0)) { request.Complete((uint)bytesDone / request.WordSize, null); } else { request.Complete(0, $"Failed to read memory at 0x{request.Address:x8}"); } } }