This repository has been archived by the owner on Feb 8, 2018. It is now read-only.
/
TargetBinaryAccess.cs
141 lines (118 loc) · 2.7 KB
/
TargetBinaryAccess.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
using System;
using System.Text;
namespace Mono.Debugger
{
[Serializable]
public sealed class TargetBlob
{
public readonly byte[] Contents;
public readonly TargetMemoryInfo TargetMemoryInfo;
public TargetBlob (byte[] contents, TargetMemoryInfo target_info)
{
this.Contents = contents;
this.TargetMemoryInfo = target_info;
}
public TargetBlob (int size, TargetMemoryInfo target_info)
{
this.Contents = new byte [size];
this.TargetMemoryInfo = target_info;
}
public int Size {
get { return Contents.Length; }
}
public TargetBinaryReader GetReader ()
{
return new TargetBinaryReader (this);
}
}
[Serializable]
public class TargetBinaryAccess
{
protected TargetBlob blob;
protected int pos;
protected bool swap;
public TargetBinaryAccess (TargetBlob blob)
{
this.blob = blob;
this.swap = blob.TargetMemoryInfo.IsBigEndian;
}
public int AddressSize {
get {
int address_size = blob.TargetMemoryInfo.TargetAddressSize;
if ((address_size != 4) && (address_size != 8))
throw new TargetMemoryException (
"Unknown target address size " + address_size);
return address_size;
}
}
public TargetMemoryInfo TargetMemoryInfo {
get {
return blob.TargetMemoryInfo;
}
}
public long Size {
get {
return blob.Contents.Length;
}
}
public long Position {
get {
return pos;
}
set {
pos = (int) value;
}
}
public bool IsEof {
get {
return pos == blob.Contents.Length;
}
}
public byte[] Contents {
get {
return blob.Contents;
}
}
public string HexDump ()
{
return HexDump (blob.Contents);
}
public static string HexDump (byte[] data)
{
StringBuilder sb = new StringBuilder ();
if (data == null)
return "[]";
sb.Append ("\n" + TargetAddress.FormatAddress (0) + " ");
for (int i = 0; i < data.Length; i++) {
if (i > 0) {
if ((i % 16) == 0)
sb.Append ("\n" + TargetAddress.FormatAddress (i) + " ");
else if ((i % 8) == 0)
sb.Append (" - ");
else
sb.Append (" ");
}
sb.Append (String.Format ("{1}{0:x}", data [i], data [i] >= 16 ? "" : "0"));
}
return sb.ToString ();
}
public static string HexDump (TargetAddress start, byte[] data)
{
StringBuilder sb = new StringBuilder ();
sb.Append (String.Format ("{0} ", start));
for (int i = 0; i < data.Length; i++) {
if (i > 0) {
if ((i % 16) == 0) {
start += 16;
sb.Append (String.Format ("\n{0} ", start));
} else if ((i % 8) == 0)
sb.Append (" - ");
else
sb.Append (" ");
}
sb.Append (String.Format ("{1}{0:x}", data [i], data [i] >= 16 ? "" : "0"));
}
return sb.ToString ();
}
}
}