|
1 | 1 | from typing import List, Optional |
2 | | - |
3 | 2 | from .hash import hash_elems |
4 | | -from .group import ElementModQ, q_to_bytes, bytes_to_q |
5 | | -from .words import get_word, get_index_from_word |
| 3 | +from .group import ElementModQ |
| 4 | +from .words import get_word |
6 | 5 |
|
7 | 6 | DEFAULT_SEPERATOR = "-" |
8 | 7 |
|
@@ -39,32 +38,29 @@ def tracker_hash_to_words( |
39 | 38 | :return: Human readable tracker string or None |
40 | 39 | """ |
41 | 40 |
|
42 | | - segments = q_to_bytes(tracker_hash) |
| 41 | + segments = tracker_hash.to_bytes() |
43 | 42 | words: List[str] = [] |
44 | | - for value in segments: |
45 | | - word = get_word(value) |
46 | | - if word is None: |
47 | | - return None |
48 | | - words.append(word) |
49 | | - # FIXME ISSUE #82 Minimize length of tracker |
50 | | - return seperator.join(words) |
| 43 | + for i in range(0, len(segments), 4): |
| 44 | + # Select 4 bytes for the segment |
| 45 | + first = segments[i] |
| 46 | + second = segments[i + 1] |
| 47 | + third = segments[i + 2] |
| 48 | + fourth = segments[i + 3] |
51 | 49 |
|
| 50 | + # word is byte(1) + 1/2 of byte(2) |
| 51 | + word_part = get_word((first * 16 + (second >> 4))) |
52 | 52 |
|
53 | | -def tracker_words_to_hash( |
54 | | - tracker_words: str, seperator: str = DEFAULT_SEPERATOR |
55 | | -) -> Optional[ElementModQ]: |
56 | | - """ |
57 | | - Convert tracker from human readable / friendly words to hash |
58 | | - :param tracker_words: Tracker words |
59 | | - :param seperator: Seperator used between words |
60 | | - :return: Tracker hash or None |
61 | | - """ |
62 | | - words = tracker_words.split(seperator) |
63 | | - int_values: List[int] = [] |
64 | | - for word in words: |
65 | | - index = get_index_from_word(word) |
66 | | - if index is None: |
| 53 | + # hex is other 1/2 of byte(2) + byte(3) + byte(4) |
| 54 | + hex_part = [ |
| 55 | + format((second & 0x0F) >> 0, "1X"), |
| 56 | + format((third & 0xF0) >> 4, "1X"), |
| 57 | + format((third & 0x0F) >> 0, "1X"), |
| 58 | + format((fourth & 0xF0) >> 4, "1X"), |
| 59 | + format((fourth & 0x0F) >> 0, "1X"), |
| 60 | + ] |
| 61 | + if word_part is None: |
67 | 62 | return None |
68 | | - int_values.append(index) |
69 | | - value = bytes(int_values) |
70 | | - return bytes_to_q(value) |
| 63 | + words.append(word_part) |
| 64 | + words.append("".join(hex_part)) |
| 65 | + # FIXME ISSUE #82 Minimize length of tracker |
| 66 | + return seperator.join(words) |
0 commit comments