228 lines
8.9 KiB
Python
228 lines
8.9 KiB
Python
def bin_to_xml(file_name):
|
|
try:
|
|
if file_name.split(".")[-1] != "bin":
|
|
print("Ошибка: тип файла должен быть bin")
|
|
exit()
|
|
with open(file_name, "rb") as file:
|
|
bin_file = file.read()
|
|
xml_file = str()
|
|
bin_file = bin_file.decode().split(" ")
|
|
for i in bin_file:
|
|
xml_file += chr(int(i, 2))
|
|
value = unparse_value(xml_file)
|
|
flag = False
|
|
new_value = str()
|
|
for i in range(len(value) - 1):
|
|
if flag:
|
|
if value[i] == '"' and value[i - 1] != "\\":
|
|
flag = False
|
|
continue
|
|
elif value[i] == '"' and value[i - 1] != "\\":
|
|
flag = True
|
|
continue
|
|
new_value += value[i]
|
|
if value[i] == "\n":
|
|
new_value += " "
|
|
xml_file = "<root>\n " + new_value + "\n</root>\n"
|
|
with open(".".join(file_name.split(".")[:-1])+".xml", "w", encoding="utf-8") as file:
|
|
file.write(xml_file)
|
|
except Exception as e:
|
|
print("Ошибка: ", e)
|
|
|
|
|
|
def unparse_value(value: str) -> str:
|
|
try:
|
|
new_value = str()
|
|
while len(value) != 0:
|
|
if value[0] == "o":
|
|
object, value = unparse_object(value)
|
|
new_value += object
|
|
elif value[0] == "a":
|
|
array, value = unparse_array(value)
|
|
new_value += array
|
|
elif value[0] == "s":
|
|
for i in range(2, len(value)-1):
|
|
if value[i] == '"' and value[i-1] != "\\":
|
|
new_value += value[2:i-1]
|
|
if len(value[i:]) > 2:
|
|
value = value[i+2:]
|
|
else: value = ""
|
|
break
|
|
elif i + 1 == len(value)-1:
|
|
new_value += value[2:len(value)-1]
|
|
value = ""
|
|
elif value[0] == "n":
|
|
if value.count(" ") == 0:
|
|
new_value += value[1:]
|
|
value = ""
|
|
else:
|
|
new_value += value[1:value.index(" ")]
|
|
value = value[value.index(" ")+1:]
|
|
elif value[0] == "t":
|
|
if len(value) == 1: value = ""
|
|
else: value = value[2:]
|
|
new_value += "true"
|
|
elif value[0] == "f":
|
|
if len(value) == 1: value = ""
|
|
else: value = value[2:]
|
|
new_value += "false"
|
|
elif value[0] == "v":
|
|
if len(value) == 1: value = ""
|
|
else: value = value[2:]
|
|
new_value += "null"
|
|
else:
|
|
print("Ошибка в определении типа элемента " + value)
|
|
exit()
|
|
return new_value
|
|
except Exception as e:
|
|
print("Ошибка при определении типа элемента: ", e)
|
|
|
|
|
|
def unparse_object(object: str) -> tuple[str, str]:
|
|
def error():
|
|
print("Ошибка в определении объекта " + object)
|
|
exit()
|
|
try:
|
|
result = dict()
|
|
index, object = object[1:object.index(" ")], object[object.index(" ")+1:]
|
|
for _ in range(int(index)):
|
|
key = str()
|
|
if object[0] == "s":
|
|
for i in range(2, len(object)-1):
|
|
if object[i] == '"' and object[i-1] != "\\":
|
|
key = object[2:i]
|
|
object = object[i+2:]
|
|
break
|
|
else: error()
|
|
if object.count(" ") == 0:
|
|
value = unparse_value(object)
|
|
object = ""
|
|
elif object[0] in "ntfv":
|
|
value = object[1:object.index(" ")]
|
|
object = object[object.index(" ")+1:]
|
|
value = unparse_value(value)
|
|
elif object[0] == "s":
|
|
for i in range(2, len(object)-1):
|
|
if object[i] == '"' and object[i-1] != "\\":
|
|
value = object[2:i]
|
|
if len(object[i:]) > 2:
|
|
object = object[i+2:]
|
|
else:
|
|
object = ""
|
|
break
|
|
elif object[0] == "a":
|
|
value, object = unparse_array(object)
|
|
value = "\n" + value + "\n"
|
|
flag = False
|
|
new_value = str()
|
|
for i in range(len(value) - 1):
|
|
if flag:
|
|
if value[i] == '"' and value[i - 1] != "\\":
|
|
flag = False
|
|
continue
|
|
elif value[i] == '"' and value[i - 1] != "\\":
|
|
flag = True
|
|
continue
|
|
new_value += value[i]
|
|
if value[i] == "\n":
|
|
new_value += " "
|
|
value = new_value + "\n"
|
|
elif object[0] == "o":
|
|
value, object = unparse_object(object)
|
|
value = "\n" + value + "\n"
|
|
flag = False
|
|
new_value = str()
|
|
for i in range(len(value)-1):
|
|
if flag:
|
|
if value[i] == '"' and value[i - 1] != "\\":
|
|
flag = False
|
|
continue
|
|
elif value[i] == '"' and value[i - 1] != "\\":
|
|
flag = True
|
|
continue
|
|
new_value += value[i]
|
|
if value[i] == "\n":
|
|
new_value += " "
|
|
value = new_value[:-4]
|
|
else: error()
|
|
result.setdefault(key, value)
|
|
new_result = str()
|
|
for i in [[list(result.keys())[i], list(result.values())[i]] for i in range(len(result.keys()))]:
|
|
key = i[0]
|
|
value = i[1]
|
|
new_result += "<" + key + ">" + value + "</" + key + ">\n"
|
|
result = new_result
|
|
return result, object
|
|
except Exception as e:
|
|
print("Ошибка при определении объекта: ", e)
|
|
|
|
|
|
def unparse_array(array: str) -> tuple[str, str]:
|
|
try:
|
|
result = list()
|
|
index, array = array[1:array.index(" ")], array[array.index(" ")+1:]
|
|
for _ in range(int(index)):
|
|
if array.count(" ") == 0:
|
|
result.append(unparse_value(array))
|
|
array = ""
|
|
elif array[0] in "ntfv":
|
|
value = array[:array.index(" ")]
|
|
array = array[array.index(" ")+1:]
|
|
result.append(unparse_value(value))
|
|
elif array[0] == "s":
|
|
for i in range(2, len(array)-1):
|
|
if array[i] == '"' and array[i-1] != "\\":
|
|
result.append("<element>" + array[2:i] + "</element>\n")
|
|
if len(array[i:]) > 2:
|
|
array = array[i+2:]
|
|
else:
|
|
array = ""
|
|
break
|
|
elif array[0] == "a":
|
|
value, array = unparse_array(array)
|
|
flag = False
|
|
new_value = str()
|
|
for i in range(len(value)):
|
|
if flag:
|
|
if value[i] == '"' and value[i - 1] != "\\":
|
|
flag = False
|
|
continue
|
|
elif value[i] == '"' and value[i - 1] != "\\":
|
|
flag = True
|
|
continue
|
|
new_value += value[i]
|
|
if value[i] == "\n":
|
|
new_value += " "
|
|
value = "\n " + new_value + "\n"
|
|
result.append(value)
|
|
elif array[0] == "o":
|
|
value, array = unparse_object(array)
|
|
flag = False
|
|
new_value = str()
|
|
for i in range(len(value)-1):
|
|
if flag:
|
|
if value[i] == '"' and value[i-1] != "\\":
|
|
flag = False
|
|
continue
|
|
elif value[i] == '"' and value[i-1] != "\\":
|
|
flag = True
|
|
continue
|
|
new_value += value[i]
|
|
if value[i] == "\n":
|
|
new_value += " "
|
|
value = "\n " + new_value + "\n"
|
|
result.append(value)
|
|
else:
|
|
print("Ошибка в определении массива " + str(result))
|
|
exit()
|
|
new_result = str()
|
|
for i in result:
|
|
new_result += "<element>" + i + "</element>\n"
|
|
result = new_result
|
|
return result[:-1], array
|
|
except Exception as e:
|
|
print("Ошибка при определении массива: ", e)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
bin_to_xml("schedule.bin") |