-
Notifications
You must be signed in to change notification settings - Fork 51
/
Copy pathutils.py
95 lines (75 loc) · 3.23 KB
/
utils.py
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
import string
def strings(binary, min=4):
result = ""
for c in binary:
c = chr(c)
if c in string.printable[:-5]:
result += c
continue
if len(result) >= min:
yield result
result = ""
if len(result) >= min: # catch result at EOF
yield result
def union(range_list):
res = []
for begin, end in sorted(range_list):
if res and res[-1][1] >= begin-1:
res[-1][1] = max(res[-1][1], end)
else:
res.append([begin, end])
return [(item[0], item[1]) for item in res]
def intersect(range_list):
res = None
for begin, end in sorted(range_list):
if not res:
res = [begin, end]
elif res[1] >= begin:
res[0] = begin
else:
res = None
return (res[0], res[1]) if res else None
def range_size(r):
return r[1]-r[0]+1
def generate_ranges(selected_range_list, subdiv, min_section_size):
minimal_range_set = True
selected_range_list = union(selected_range_list)
res = []
for selected_range in selected_range_list:
if range_size(selected_range) <= min_section_size:
res.append(selected_range)
minimal_range_set = False
section_size = int(range_size(selected_range)/subdiv) if int(range_size(selected_range)/subdiv) > min_section_size else min_section_size
while range_size(selected_range) > 0:
current_range = (selected_range[0], selected_range[0]+section_size-1)
current_range = intersect([selected_range, current_range])
res.append(current_range)
selected_range = (selected_range[0]+section_size, selected_range[1])
return [(item[0], item[1]) for item in res], minimal_range_set
def get_ranges_from_str(ranges_str, file_size):
res = []
for range_str in ranges_str.split(","):
if not ":" in range_str:
continue
try:
start = int(range_str.split(":")[0], 16 if range_str.split(":")[0].startswith("0x") else 10) if range_str.split(":")[0] != "" else 0
end = int(range_str.split(":")[1], 16 if range_str.split(":")[1].startswith("0x") else 10) if range_str.split(":")[1] != "" else file_size-1
if start < 0:
raise Exception("Incorrect input range (example: ':0x100,0x150:0x1a0,0x1b0:')")
if end < 0:
raise Exception("Incorrect input range (example: ':0x100,0x150:0x1a0,0x1b0:')")
except ValueError:
raise Exception("Incorrect input range (example: ':0x100,0x150:0x1a0,0x1b0:')")
if start < end:
res.append((start, end))
return union(res)
def get_replacing_value_from_str(replacing_value_str):
if replacing_value_str.startswith("0x"):
replacing_value = int(replacing_value_str, 16)
elif len(replacing_value_str) != 1:
raise Exception("Wrong replacing value, you can specify a byte by starting it with '0x' or a single Ascii character")
else:
replacing_value = ord(replacing_value_str)
if replacing_value < 0 or replacing_value > 255:
raise Exception("Wrong replacing value, you can specify a byte by starting it with '0x' or a single Ascii character")
return replacing_value