View difference between Paste ID: 462qzirt and m5Rns49D
SHOW: | | - or go back to the newest paste.
1
2
def split_as_size(arr,size):return arr[:size],arr[size:]
3
4-
def bytes_to_int(bytes):
4+
5-
	#fill this in later.
5+
6-
	# I'm rusty on how python handles bytes tbh
6+
7-
	r,place=0,len(bytes)-1
7+
8-
	for i in range(place,0,-1):
8+
9-
		r+= (255**place) * int(bytes[i])#I think this works.
9+
10-
	return r
10+
11
	def create_from_bytes(cls,byte_array):
12
		def extract_chunk(arr):
13
			offset,arr=split_as_size(arr,3)
14
			size,arr=split_as_size(arr,2)
15
			data,arr=split_as_size(arr,int.from_bytes(size))
16
			return Chunk(offset,int.from_bytes(data)),arr
17
		def pull_all_chunks(arr):
18
			while len(arr)>3:
19
				chunk,arr=extract_chunk(arr)
20
				yield chunk
21
		return cls(list(pull_all_chunks(byte_array)))
22
	def __init__(self,chunks):self.chunks = chunks
23-
			data,arr=split_as_size(arr,size)
23+
24-
			return Chunk(offset,data),arr
24+
25
			arr[chunk.position:chunk.position+chunk.size]=chunk.data
26
		return arr
27-
				chunk,byte_array=extract_chunk(arr)
27+
28
if __name__=="__main__":
29
	from sys import argv;argv=argv[1:]
30
	from os.path import isfile
31
	patches,target=[],None
32
	for filename in argv:
33
		if not isfile(filename):continue
34
		if filename[:filename.rfind(".")].lower()=='ips':
35
			patches.append(filename)
36
		else:target=filename
37
	if target and patches:
38
		base_data = open(target,'rb').read()#read in the data to modify.
39
		for patch in map(IPS.create_from_stream,map(lambda fn:open(fn,'rb'),patches)):
40
			base_data=patch.apply(base_data)
41
		with open('patched-{}-{}'.format("-".join(map(patch_name,patches)),target),'wb') as output:
42
			output.write(base_data)