Add 'Informatics/InfLab4/' from commit '639d363dfbc85a37e6c2ba0dda202107ab3769d1'
git-subtree-dir: Informatics/InfLab4 git-subtree-mainline:a51dfe26c0git-subtree-split:639d363dfb
This commit is contained in:
@@ -0,0 +1,228 @@
|
||||
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")
|
||||
Reference in New Issue
Block a user