带GUI的十六进制字符串匹配需求:仅匹配第二个半字节
Hey there! Let's figure out how to adjust your GUI Hex search tool to support that partial nibble matching you need. Right now you've got exact matches working, so we'll build on that to ignore the first nibble of each byte. Here's a step-by-step breakdown:
First, we'll pre-process your CSV data so we can quickly match against the second nibble of each byte. This way, we don't have to parse the CSV every time someone searches—we'll create a ready-to-use mapping upfront.
Suppose you already load your CSV into a dictionary like hex_to_code where keys are full hex strings (e.g., "A1B7C2DA") and values are their corresponding codes. We'll transform this into a new dictionary that uses the second nibble of each byte as the key:
# After loading your original hex_to_code dictionary from CSV processed_mappings = {} for full_hex, code in hex_to_code.items(): # Clean up the hex string by removing spaces and splitting into bytes cleaned_hex = full_hex.replace(" ", "") byte_chunks = [cleaned_hex[i:i+2] for i in range(0, len(cleaned_hex), 2)] # Extract only the second nibble from each byte (the 2nd character in each 2-char chunk) target_key = "".join([byte[1].upper() for byte in byte_chunks]) # Handle multiple entries with the same nibble pattern (store as list if needed) if target_key in processed_mappings: processed_mappings[target_key].append(code) else: processed_mappings[target_key] = [code]
(Note: If you only expect one code per nibble pattern, you can simplify this to just overwrite the value instead of using a list.)
Next, we'll modify your search function to take the user's input, extract the second nibble from each byte, and look it up in our preprocessed mapping:
def search_partial_hex(input_str): # Clean up the user's input cleaned_input = input_str.replace(" ", "").upper() # Validate input is a valid even-length hex string if len(cleaned_input) % 2 != 0 or not all(c in "0123456789ABCDEF" for c in cleaned_input): return "Invalid hex string! Please enter an even-length string of hex characters." # Split input into byte chunks and extract second nibbles input_bytes = [cleaned_input[i:i+2] for i in range(0, len(cleaned_input), 2)] search_key = "".join([byte[1] for byte in input_bytes]) # Look up the key in our processed mappings matches = processed_mappings.get(search_key, []) if matches: return "\n".join(matches) # Return all matching codes else: return "No matching code found."
Now plug this into your existing codeOutputF... function (or whatever handles displaying results in your GUI). For example, if your button click handler looks something like this:
def on_search_clicked(): user_input = hex_input_box.get("1.0", tk.END).strip() # Adjust based on your GUI framework result = search_partial_hex(user_input) code_output_field.delete("1.0", tk.END) code_output_field.insert("1.0", result)
Replace your old exact-match lookup with the search_partial_hex function, and you're good to go!
- Case Insensitivity: We converted everything to uppercase to make matches work regardless of whether the user enters
11 d7or11 D7. - Invalid Input: The validation step catches odd-length strings or non-hex characters, so you can give the user clear feedback.
- Multiple Matches: If multiple CSV entries have the same second-nibble pattern, we return all of them—adjust this if you only want the first match.
When a user enters 11 D7 E2 FA, the function will extract the second nibbles (1, 7, 2, A) to form the key 172A, then find all CSV entries where each byte ends with those nibbles (like x1 x7 x2 xA) and return their codes.
内容的提问来源于stack exchange,提问作者Szász Ervin

