この記事は、 SHA256を計算する in Pythonのステップ2です。
16進数文字列、2進数文字列、数値などの変換を関数にしてまとめておきます。
format
関数は使いませんでしたので、その分長くなっています。
変換に使用する関数は、すべて ValueConversion
というクラスにまとめておきます。
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
class ValueConversion: @staticmethod def _int_to_hex(num): assert 0 <= num < 16 if num < 10: return str(num) else: return chr(ord('a') + num - 10) @staticmethod def _hex_to_int(char): if char.isdigit(): return int(char) else: return ord(char) - ord('a') + 10 @staticmethod def decimal_hex_digits(num): h = 2 ** 4 # 16 u = 1 / h s = "" num %= 1 for i in range(8): d = num // u s += ValueConversion._int_to_hex(int(d)) num = (num - u * d) num *= h return s @staticmethod def hex_to_integer(s): """ convert hex string to integer example: >>> ValueConversion.hex_to_integer("1") 1 >>> ValueConversion.hex_to_integer("a") 10 >>> ValueConversion.hex_to_integer("ff") 255 :param s: :return: """ n = 0 for c in s: assert c in "0123456789abcdef" n <<= 4 n += int(c, 16) return n @staticmethod def bitstring_to_integer(s: str) -> int: """ convert bit string to integer example: >>> ValueConversion.bitstring_to_integer("1") 1 >>> ValueConversion.bitstring_to_integer("101") 5 >>> ValueConversion.bitstring_to_integer("10101") 21 :param s: :return: """ n = 0 for c in s: assert c in "01" n <<= 1 n += int(c) return n @staticmethod def integer_to_bitstring(n: int, l: int = 0) -> str: """ convert integer to bit string example: >>> ValueConversion.integer_to_bitstring(1) '1' >>> ValueConversion.integer_to_bitstring(5) '101' :param n: :param l: :return: """ s = "" while n > 0: s = str(n % 2) + s n //= 2 if l > 0: s = "0" * (l - len(s)) + s return s @staticmethod def integer_to_hexstring(n: int, l: int = 0) -> str: """ convert integer to hex string example: >>> ValueConversion.integer_to_hexstring(1) '1' >>> ValueConversion.integer_to_hexstring(10) 'a' >>> ValueConversion.integer_to_hexstring(255) 'ff' :param n: :param l: :return: """ s = "" while n > 0: s = ValueConversion._int_to_hex(n % 16) + s n //= 16 if l > 0: s = "0" * (l - len(s)) + s return s @staticmethod def hexstring_to_bitstring(hexstring: str) -> str: """ convert hex string to bit string example: >>> ValueConversion.hexstring_to_bitstring("1") '0001' >>> ValueConversion.hexstring_to_bitstring("a") '1010' >>> ValueConversion.hexstring_to_bitstring("ff") '11111111' :param hexstring: :return: """ for c in hexstring: assert c in "0123456789abcdef" def _hex_to_bitstring(c): n = ValueConversion._hex_to_int(c) s = "" for _ in range(4): s = str(n % 2) + s n >>= 1 return s return "".join(map(lambda x: _hex_to_bitstring(x), hexstring)) |
_int_to_hex
, _hex_to_int
はクラス内部からしか呼ばれません。 これらは Python で標準的に使える関数を使用することもできます。 _int_to_hex(x)
は format(x, 'x')
で、 _hex_to_int(x)
は int(x, 16)
で代用できます。
次のステップは ビット演算の実装 です。