Embedded_game/002_B_Car/主程序/处理二维码数据.py
2025-01-02 12:48:11 +08:00

681 lines
21 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding:utf-8 -*-
# @Author len
# @Create 2023/12/20 14:15
# 从一个字符串中移除所有的中文字符,并返回一个新的不包含中文字符的字符串
def remove_chinese_chars(self, text):
"""移除字符串中的中文字符,并返回新的字符串"""
# 定义中文字符的Unicode范围
chinese_char_ranges = [
('\u4e00', '\u9fff'), # 基本汉字
('\u3400', '\u4dbf'), # 扩展A
('\u20000', '\u2a6df'), # 扩展B
# 可以根据需要添加更多的中文范围
]
# 移除中文字符
return ''.join(char for char in text if not any(start <= char <= end for start, end in chinese_char_ranges))
# 检查一个给定的字符串 text 是否是一个有效的公式
def if_formula(self, text):
# 允许的字符:数字、运算符和括号
allowed_chars = "0123456789+-*/%^().abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
# 检查字符是否合法
for char in text:
if char not in allowed_chars:
return False
# 括号匹配检查
bracket_count = 0
for char in text:
if char == '(':
bracket_count += 1
elif char == ')':
bracket_count -= 1
if bracket_count < 0: # 右括号多于左括号
return False
if bracket_count != 0: # 左括号和右括号数量不匹配
return False
return True
# 提取中文字符和字母数字字符
def extract_chinese_and_alphanumeric_without_regex(text):
chinese_str = ''
alphanumeric_str = ''
for char in text:
# 检查是否是中文字符
if '\u4e00' <= char <= '\u9fff':
chinese_str += char
# 检查是否是字母或数字
elif char.isalnum():
alphanumeric_str += char
return chinese_str, alphanumeric_str
# 提取字符和数字
def extract_numbers_and_letters_combined(text):
combined_str = ''
for char in text:
# 检查字符是否是数字0-9或字母A-Z 或 a-z
if ('0' <= char <= '9') or ('A' <= char <= 'Z') or ('a' <= char <= 'z'):
combined_str += char
return combined_str
# print(extract_numbers_and_letters_combined("A/145#B6"))
# 提取数字字符
def extract_numbers_without_isdigit(text):
numbers_str = ''
for char in text:
# 检查字符是否是数字0-9
if '0' <= char <= '9':
numbers_str += char
return numbers_str
# 提取字母字符
def extract_letters_without_isalpha(text):
letters_str = ''
for char in text:
# 检查字符是否是字母A-Z 或 a-z
if ('A' <= char <= 'Z') or ('a' <= char <= 'z'):
letters_str += char
return letters_str
# 对字符串数字进行排序
def sort_numbers_without_function(text):
# 将字符串转换为数字列表
numbers_list = [int(char) for char in text]
# 使用简单的排序算法(如冒泡排序)对列表排序
for i in range(len(numbers_list)):
for j in range(0, len(numbers_list)-i-1):
if numbers_list[j] > numbers_list[j+1]:
numbers_list[j], numbers_list[j+1] = numbers_list[j+1], numbers_list[j]
# 将排序后的数字列表转换回字符串
sorted_str = ''.join(str(num) for num in numbers_list)
return sorted_str
# 对字符串字符进行排序
def sort_letters_without_function(text):
# 将字符串转换为字符列表
letters_list = [char for char in text]
# 使用简单的排序算法(如冒泡排序)对列表排序
for i in range(len(letters_list)):
for j in range(0, len(letters_list)-i-1):
if letters_list[j] > letters_list[j+1]:
letters_list[j], letters_list[j+1] = letters_list[j+1], letters_list[j]
# 将排序后的字符列表转换回字符串
sorted_str = ''.join(letters_list)
return sorted_str
def shandong(text):
str_result = ""
number_result = ""
for t in text:
if 'A'<= t <= 'G':
str_result += t
elif '0' <= t <= '7':
number_result += t
return str_result + number_result
def compress_string(input_string):
# 检查输入字符串是否为空
if not input_string:
return ""
# 初始化压缩后的字符串、当前字符和其出现次数
compressed_string = ""
current_char = input_string[0]
count = 1
# 遍历字符串,从第二个字符开始
for char in input_string[1:]:
if char == current_char:
# 如果当前字符与前一个字符相同,增加计数
count += 1
else:
# 如果当前字符与前一个字符不同,根据计数添加字符
if count > 1:
compressed_string += str(count) + current_char
else:
compressed_string += current_char
current_char = char
count = 1
# 添加最后一个字符(或字符组)
if count > 1:
compressed_string += str(count) + current_char
else:
compressed_string += current_char
return compressed_string
#
# # 测试函数
# input_string = "1EE55FFFCC333"
# compressed_string = compress_string(input_string)
# print(compressed_string)
# 统计连续字符出现的次数
# test_string = "1EE55FFFCC333"
# result = 11E252F3C233
def encode_string(s):
# 初始化结果字符串和当前字符计数器
result = ""
count = 1
# 如果字符串为空,直接返回空结果
if not s:
return result
# 遍历字符串中的每个字符
for i in range(1, len(s)):
# 如果当前字符与前一个字符相同,增加计数
if s[i] == s[i - 1]:
count += 1
else:
# 如果当前字符与前一个字符不同,将前一个字符和计数添加到结果字符串
result += s[i - 1] + str(count)
count = 1 # 重置计数器
# 添加最后一个字符和其计数
result += s[-1] + str(count)
return result
# # 测试函数
# test_string = "1EE55FFFCC333"
# encoded_string = encode_string(test_string)
# print(encoded_string)
# test_string = "1E8E55F6FF7C86C3933"
# result = 11E181E152F161F271C18161C1319132
# 统计每个字符出现的次数
def encode_string2(test_string):
# 统计每个字符的出现次数
char_counts = {}
for char in test_string:
if char in char_counts:
char_counts[char] += 1
else:
char_counts[char] = 1
# 将统计结果格式化为字符串
encoded_string = ''.join(f"{char}{count}" for char, count in char_counts.items())
return encoded_string
# 测试函数
# test_string = "1E8E55F6FF7C86C3933"
# encoded_string = encode_string(test_string)
# print(encoded_string)
def encode_string(test_string):
char_counts = {} # 字符计数的字典
order = [] # 记录字符出现的顺序
# 统计每个字符的出现次数,并记录顺序
for char in test_string:
if char in char_counts:
char_counts[char] += 1
else:
char_counts[char] = 1
order.append(char) # 记录新字符的顺序
# 构建编码后的字符串
encoded_string = ''.join([char + str(char_counts[char]) for char in order])
return encoded_string
# # 测试字符串
# test_string = "1E686E8585F6FFCC333"
# encoded_string = encode_string(test_string)
# print("Encoded string:", encoded_string)
# txt = "7%%¥&D**"
# print(shandong(txt))
#
# def remove_non_ascii_chars(text):
# """移除字符串中的非ASCII字符并返回新的字符串"""
# # 只保留ASCII字符
# return ''.join(char for char in text if ord(char) < 128)
# 移除ASCII码值的字符
# # 使用该函数提取中文字符和字母数字字符
# test_str = "0 人 E12*34A 才强 B5678%国 CD&9”"
# chinese, alphanumeric = extract_chinese_and_alphanumeric_without_regex(test_str)
# print(chinese, alphanumeric)
# print(extract_numbers_without_isdigit(alphanumeric))
# txxt = "101110+0100-011"
# print(binary_to_hexadecimal("0101001"))
# 简单的字符串处理函数来解析JSON格式的数据
def parse_simple_json(data_str):
data_str = data_str.strip()[1:-1] # 去除首尾的大括号
parsed_data = {}
nested_obj = False
key = ''
value = ''
for char in data_str:
if char == '{': # 嵌套对象开始
nested_obj = True
value += char
elif char == '}': # 嵌套对象结束
nested_obj = False
value += char
elif char == ':' and not nested_obj: # 键值分隔
key = value.strip().strip('"')
value = ''
elif char == ',' and not nested_obj: # 键值对分隔
parsed_data[key] = value.strip().strip('"')
key = ''
value = ''
elif char in [" ", '\n', "'", '"']:
continue
else:
value += char
if key: # 添加最后一个键值对
parsed_data[key] = value.strip().strip('"')
return parsed_data
# 解析函数只适用于非常简单的JSON结构
# 它不会处理嵌套对象、数组、布尔值或null值
# data = '''{
# "code": "2023",
# "algorithm": "0123456789ABCDE ",
# "result": {
# "purpose": "赛课融通,综合育人"
# },
# "number": 1
# }'''
#
# # 使用字符串处理来解析JSON格式的数据
# parsed_data_str = parse_simple_json(data)
#
# # 显示解析后的数据
# print(parsed_data_str)
# 提取字符和数字
def lingxuansai(text):
result = ""
str_text = ''
for char in text:
# 检查字符是否是数字0-9或字母A-Z 或 a-z
if ('0' <= char <= '9') or ('A' <= char <= 'F'):
str_text += char
dict_result = {}
for c in str_text:
dict_result[c] = dict_result.get(c, 0) + 1
# print(dict_result)
list_result = dict_result.items()
list_result = (sorted(list_result, key=lambda x: x[0], reverse=False))
# print(list_result)
list_result = (sorted(list_result, key=lambda x: x[1], reverse=True))
# print(list_result)
char_flag = 0
number_flag = 0
for i in range(len(list_result)):
if 'A' <= list_result[i][0] <= 'Z' and char_flag == 0:
char_flag = 1
# text.find(list_result[i][0])
# result += f"{list_result[i][0]}{str_text.find(list_result[i][0]) + 1}"
result += list_result[i][0] + chr(str_text.find(list_result[i][0]) + 1 + 48)
for i in range(len(list_result)):
if '0' <= list_result[i][0] <= '9' and number_flag == 0:
number_flag = 1
# result += f"{list_result[i][0]}{str_text.find(list_result[i][0]) + 1}"
result += list_result[i][0] + chr(str_text.find(list_result[i][0]) + 1 + 48)
return result
# str = "/B2<AC3A%B2AA>E"
# print(str)
# str = lingxuansai(str)
# print(str)
def extract_differences(text_list):
"""
该函数接收一个包含两个二维码字符串的列表,提取尖括号内的有效信息,
并根据给定规则返回两个二维码之间的差异数据。
"""
extracted_data = [] # 初始化一个列表来存储提取的数据
for text in text_list:
bracket_content = [] # 用于临时存储尖括号内的数据
inside_bracket = False # 用于标记是否处于尖括号内部
for char in text:
if char == '<': # 如果遇到左尖括号,则开始记录数据
inside_bracket = True
elif char == '>': # 如果遇到右尖括号,则结束记录数据
if inside_bracket:
# 如果确实记录了数据,结束记录,并将其添加到结果列表中
extracted_data.append(''.join(bracket_content))
bracket_content = [] # 重置临时存储
inside_bracket = False # 重置标记
elif inside_bracket:
# 如果处于尖括号内部,则将字符添加到临时存储中
bracket_content.append(char)
# # 检查提取的数据是否确切地为15个字节长
# if not all(len(data) == 15 for data in qr_data):
# return "错误尖括号内的数据不是15个字节长。"
# 对比数据并找出差异
differences = [[], []] # differences[0] 用于存储 QR1 != QR2 的差异,反之亦然
for a, b in zip(extracted_data[0], extracted_data[1]):
if a != b:
differences[0].append(a)
differences[1].append(b)
# 按要求返回合并后的差异数据
char_list = differences[0] + differences[1]
return ''.join(char_list)
# # 示例二维码文本列表
# QR_txt = ["A<A1B2C3D4E5F6>", "B<A1B2D1D4E5F7>"]
# if len(QR_txt) == 2:
# # 调用函数处理示例列表
# print(extract_differences(QR_txt))
# else:
# print("错误:列表中必须包含两个二维码字符串。")
# # QR_txt = ["A<A1B2C3D4E5F6>", "A<A1B2C3D4E5F6>"]
red = "5%Ar<b3!#<28,27,153>"
green = "2#A2%3b5|<5,6,153>"
# 判断水仙花数
def is_narcissistic_number(num):
num_str = str(num)
num_length = len(num_str)
sum_of_powers = sum(int(digit) ** num_length for digit in num_str)
return sum_of_powers == num
test_numbers = [153, 370, 371, 407, 1634, 8208, 9474, 9475]
results = {number: is_narcissistic_number(number) for number in test_numbers}
# print(is_narcissistic_number(370))
print(results)
def extract_parts_manual(input_str):
"""
手动解析字符串,提取尖括号前、内、后的内容。
参数:
input_str (str): 需要解析的字符串,形式可能包含尖括号括起来的部分。
返回:
tuple: 包含三个元素的元组:
- 第一个元素为尖括号前的内容 (str)
- 第二个元素为尖括号内的内容 (str),只处理第一个尖括号对,
- 第三个元素为尖括号后的内容 (str)。
如果没有找到尖括号,则尖括号内的内容为空字符串。
示例:
input_str = "5%Ar<b3!#<28,27,153>2#A2%3b5"
输出: ('5%Ar', 'b3!#', '2#A2%3b5')
"""
# 初始化变量
start_index = -1 # 最外层左尖括号的索引
bracket_count = 0 # 左尖括号计数
before_bracket = "" # 尖括号前的内容
inside_bracket = "" # 尖括号内的内容
after_bracket = "" # 尖括号后的内容
# 遍历字符串,查找最外层的尖括号
for i, char in enumerate(input_str):
if char == '<':
# 如果是第一个左尖括号,记录索引
if bracket_count == 0:
start_index = i
# 左尖括号计数加一
bracket_count += 1
elif char == '>':
# 右尖括号计数减一
bracket_count -= 1
# 如果所有左尖括号都找到了匹配的右尖括号
if bracket_count == 0:
before_bracket = input_str[:start_index] # 尖括号前的内容
inside_bracket = input_str[start_index + 1:i] # 尖括号内的内容
after_bracket = input_str[i + 1:] # 尖括号后的内容
break # 已找到最外层尖括号,退出循环
return before_bracket, inside_bracket, after_bracket
# # 示例字符串
# input_string = "5%Ar<b3!#<28,27,153>2#A2%3b5"
# result = extract_parts_manual(input_string)
# print(result)
def extract_innermost_bracket_content(input_string):
"""
提取给定字符串中最内层尖括号<>内的内容。
参数:
input_string (str): 输入的字符串。
返回:
str: 最内层尖括号内的内容,如果没有匹配则返回空字符串。
"""
depth = 0 # 嵌套深度计数器
max_depth = 0 # 最大深度
content_at_depth = {} # 存储每个深度的内容
for char in input_string:
if char == '<':
depth += 1
max_depth = max(max_depth, depth) # 更新最大深度
content_at_depth[depth] = "" # 为新的深度初始化内容
elif char == '>':
if depth > 0: # 只有在有效的深度下才减少深度
depth -= 1
elif depth > 0: # 只有在尖括号内部时才添加内容
content_at_depth[depth] += char
# 从记录的最大深度获取内容
return content_at_depth.get(max_depth, "")
# 示例使用
example_string = "这是一个示例: 1<9p*<C%15&9NY*>#>"
extracted_content = extract_innermost_bracket_content(example_string)
print("提取的内容:", extracted_content)
# 最大字串子串
def find_longest_common_substring(s1, s2):
# 初始化动态规划表
m, n = len(s1), len(s2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
longest, x_longest = 0, 0
for i in range(1, m + 1):
for j in range(1, n + 1):
if s1[i - 1] == s2[j - 1]:
dp[i][j] = dp[i - 1][j - 1] + 1
if dp[i][j] > longest:
longest = dp[i][j]
x_longest = i
else:
dp[i][j] = 0
# 返回最长公共子字符串
return s1[x_longest - longest: x_longest]
# 示例数据
# qr_code_a = "ACDXYDOPQCDB"
# qr_code_b = "RXYDOPCBKNQS"
qr_code_a = "ACDXYDOPQCDB"
qr_code_b = "RXYDOPCBKNQS"
longest_substring = find_longest_common_substring(qr_code_a, qr_code_b) #
print("最大子串", longest_substring)
# 移除最大子字符串
remaining_a = qr_code_a.replace(longest_substring, "", 1)
remaining_b = qr_code_b.replace(longest_substring, "", 1)
print("移除最大子串后", remaining_a, remaining_b)
# 拼接并排序
combined = remaining_a + remaining_b
sorted_combined = ''.join(sorted(combined))
print("拼接并排序后", sorted_combined)
# 计算前6个字符的ASCII码
ascii_codes = [hex(ord(c)) for c in sorted_combined[:6]]
print(ascii_codes)
# 尖括号外的数据
def get_test_outside_brackets(qrstring):
# 提取尖括号外的内容
start_index = qrstring.find('<')
end_index = qrstring.find('>')
# 如果尖括号存在,切割尖括号外的内容
if start_index != -1 and end_index != -1:
return qrstring[:start_index] + qrstring[end_index + 1:]
else:
# 如果尖括号不存在,返回原字符串
return qrstring
# 尖括号内的数据
def get_test_inside_brackets(qrstring):
# 提取尖括号内的内容
start_index = qrstring.find('<')
end_index = qrstring.find('>')
# 如果尖括号存在,切割尖括号内的内容
if start_index != -1 and end_index != -1:
return qrstring[start_index + 1:end_index]
else:
# 如果尖括号不存在,返回空字符串
return ""
# 比较两个字符串的内容,存第一个二维码的不同
def compare_strings(str1, str2):
result1 = ""
result2 = ""
for i in range(len(str1)):
if str1[i] != str2[i]:
result1 += str1[i]
result2 += str2[i]
return result1 + result2
def qr_240606(str1, str2):
result = ""
ch1 = get_test_outside_brackets(str1)
ch2 = get_test_outside_brackets(str2)
str1 = get_test_inside_brackets(str1)
str2 = get_test_inside_brackets(str2)
# print(str1, str2)
if ch1 == 'A':
result = compare_strings(str1, str2)
elif ch2 == 'A':
result = compare_strings(str2, str1)
return result
str1 = "A<A1B2C3D4E5F6>"
str2 = "B<A1B2D1D4E5F7>"
# result = qr_240606(str1, str2)
#
# print(result)
def qr_240606_2(red, green):
result_1 = ""
result_2 = ""
nei1 = extract_innermost_bracket_content(red)
nei2 = extract_innermost_bracket_content(green)
one = red.replace(nei1, '')
two = green.replace(nei2, '')
nei1 = extract_numbers_without_isdigit(nei1)
nei2 = extract_numbers_without_isdigit(nei2)
# print(one, two)
one_number = extract_numbers_without_isdigit(one)
two_number = extract_numbers_without_isdigit(two)
one_str = extract_letters_without_isalpha(one)
two_str = extract_letters_without_isalpha(two)
# print(one_number, one_str)
# print(two_number, two_str)
if len(one_number) == 2 and len(two_str) == 2:
result_1 = one_number + nei1
result_2 = two_str + nei2
elif len(one_str) == 2 and len(two_number) == 2:
result_1 = two_number + nei2
result_2 = one_number + nei1
return result_1+result_2
red = '5%@#<b3!#<1,3>'
green = '2#A2%3b5|<2,4>'
print(qr_240606_2(red, green))
def process_qrcode(input_str):
# 提取'0'和'1'构成序列XL
XL = ''.join([char for char in input_str if char in '01'])
# 找到首个特殊字符
first_special_char = None
for char in input_str:
if char in '+-':
first_special_char = char
break
# 依据首个特殊字符进行位移操作
if first_special_char == '+':
# 循环左移2位
XL = XL[2:] + XL[:2]
elif first_special_char == '-':
# 循环右移3位
XL = XL[-3:] + XL[:-3]
# 将结果分成高8位和低8位
if len(XL) < 16:
XL = '0' * (16 - len(XL)) + XL
print(XL)
# 将高8位和低8位分别转换为十进制
DH_bin = XL[:8]
DL_bin = XL[8:]
DH = int(DH_bin, 2)
DL = int(DL_bin, 2)
print(DH, DL)
# # 转换为十六进制格式
# DH_hex = f"0x{DH:02X}"
# DL_hex = f"0x{DL:02X}"
#
# return DH_hex, DL_hex
return DH, DL
# 示例调用
input_str = "101110+01001-011"
DH, DL = process_qrcode(input_str)
result = str(DH) + str(DL)
print(result) # 输出: 0x39, 0x2E
print(f"DH: {DH}, DL: {DL}") # 输出: DH: 0x39, DL: 0x2E