- Невозможно (?), Чтобы работать без полного его изменений
- Очевидно, идентифицируемый префикс, независимо от размера данных
- Дешевле обрабатывать (проще и быстрее код, это радикс сила двоих детей)
- Фиксированная длина строки для фиксированной длины данных
- Более однозначный (удаление «isuvzSVZ» символов)
- Совместимость с использованием семи сегментных дисплеев
- Altcoin дружественных (16 битого пространства имен, которые могут быть считаны без декодирования)
Так как меньше цифры и более идентификации / подпись символы, адрес длиннее. Это должно быть меньше проблем, так как обычные пользователи, мы надеемся использовать адреса менее часто, как протокол оплаты становится все более популярным.
Пример кода на Python (включая тесты) находится в нижней части.
Я могу писать официальный BIP, если это представляется целесообразным.
Например:
160 битых данные, такие как текущие адреса:
- 2nc111dhAPE2aUdYAOF88JhLn5jEjbULy4eFe9tyFYFE8
- 2bc511A95e74P13dPb6b5t7yrh12EhC363ayH98n1cFbr3rAHdA49nCcC1G3P71j
- 2nc5119ttL35HPhc3Hh6aHe2tOhF6rdFtAOE1ahFLt9Ecabhcn5FLea5Le71P56C
- 2bc311d126acCyAnHAjabeUtOHcr7F811j4UYE6ECtOcbcGGn4O9chAt7O7y2LU9ty9cnG4
- 2bc911AcchHheAGFnn9LC6FdF7bOc99APJtcEc46U655JheH6LCr3Y333eFEOtPJ9rj22rEcchHheAG Fnn9LC6FdF7bOc99APJtcEc46U655JheH6LCr3YJCtPYea
- 2bcb11O77GHdP53FH7Jh44OdEh3rLd4eFr2h7c8rGeErELG18yCy9O7L9LednyHJa5hyeAP77GHdP53 FH7Jh44OdEh3rLd4eFr2h7c8rGeErELG18yCyGG5drPF1
c32.py
Код:
# Цифры выбираются так, чтобы быть наименее неоднозначным
# Все они имеют уникальные глифы семь-сегмента, и не может быть легко спутать людьми
цифры = '123456789abcdehjnrtyACEFGHJLOPUY'
Radix = Len (цифры)
Защита кодирования (v):
если не LEN (v):
вернуть ''
п = 0
бит = 0
о = []
коврик = (LEN (v) * 8)% 5
если колодки:
v = B '\ 0' + v
v = ByteArray (v) # Для Python 2.7 совместимости
для г в диапазоне (LEN (v) - 1, -1, -1):
п | = v [я] << биты
бит + 8 =
в то время как биты >= 5:
o.insert (0, цифры [п & 0x1F])
N >>= 5
биты - = 5
если я == 0 и блокнот:
ломать
Возвращение '' .join (о)
Защита декодирование (ы):
п = 0
бит = 0
о = ByteArray ()
для г в диапазоне (LEN (ы) - 1, -1, -1):
п | = digits.index (с [I]) << биты
бит + 5 =
в то время как биты >= 8:
o.insert (0, п & 0xff)
N >>= 8
биты - = 8
возвратные байт (о)
Тест четкости ():
от математики импорта потолка
утверждать «» == закодировать (б «»)
для (I, Oc) в (
(1, '8'),
(2, '2'),
(3, 'J'),
(4, '4'),
(5, 'Y'),
(6, '8'),
(7, '2'),
(8, 'J'),
(9, '4'),
):
ол = INT (CEIL (я * 8/5))
пытаться:
inzero = Ъ '\ 0' * я
Inone = Ъ '\ XFF' * я
Ezero = закодировать (inzero)
eone = закодировать (Inone)
DZero = декодирования (Ezero)
DONE = декодирования (eone)
утверждают Ežero == «1» * ол
утверждают eone == ос + ( 'Y' * (ол - 1))
утверждать DZero == inzero
утверждают, сделано == InOne
кроме AssertionError:
поднять AssertionError ( «Ввод неудачной проверки длины% S»% (я))
пытаться:
для с в диапазоне (1024):
декодировать ( '111' + CHR (с))
кроме ValueError:
проходить
еще:
поднять AssertionError ( 'Неверный ввод декодированием (% 02X) не бросить ValueError' % (с))
если __name__ == '__main__':
контрольная работа()
Распечатать("Испытания прошли")
# Все они имеют уникальные глифы семь-сегмента, и не может быть легко спутать людьми
цифры = '123456789abcdehjnrtyACEFGHJLOPUY'
Radix = Len (цифры)
Защита кодирования (v):
если не LEN (v):
вернуть ''
п = 0
бит = 0
о = []
коврик = (LEN (v) * 8)% 5
если колодки:
v = B '\ 0' + v
v = ByteArray (v) # Для Python 2.7 совместимости
для г в диапазоне (LEN (v) - 1, -1, -1):
п | = v [я] << биты
бит + 8 =
в то время как биты >= 5:
o.insert (0, цифры [п & 0x1F])
N >>= 5
биты - = 5
если я == 0 и блокнот:
ломать
Возвращение '' .join (о)
Защита декодирование (ы):
п = 0
бит = 0
о = ByteArray ()
для г в диапазоне (LEN (ы) - 1, -1, -1):
п | = digits.index (с [I]) << биты
бит + 5 =
в то время как биты >= 8:
o.insert (0, п & 0xff)
N >>= 8
биты - = 8
возвратные байт (о)
Тест четкости ():
от математики импорта потолка
утверждать «» == закодировать (б «»)
для (I, Oc) в (
(1, '8'),
(2, '2'),
(3, 'J'),
(4, '4'),
(5, 'Y'),
(6, '8'),
(7, '2'),
(8, 'J'),
(9, '4'),
):
ол = INT (CEIL (я * 8/5))
пытаться:
inzero = Ъ '\ 0' * я
Inone = Ъ '\ XFF' * я
Ezero = закодировать (inzero)
eone = закодировать (Inone)
DZero = декодирования (Ezero)
DONE = декодирования (eone)
утверждают Ežero == «1» * ол
утверждают eone == ос + ( 'Y' * (ол - 1))
утверждать DZero == inzero
утверждают, сделано == InOne
кроме AssertionError:
поднять AssertionError ( «Ввод неудачной проверки длины% S»% (я))
пытаться:
для с в диапазоне (1024):
декодировать ( '111' + CHR (с))
кроме ValueError:
проходить
еще:
поднять AssertionError ( 'Неверный ввод декодированием (% 02X) не бросить ValueError' % (с))
если __name__ == '__main__':
контрольная работа()
Распечатать("Испытания прошли")
c32d.py
Код:
импорт c32
импорт hashlib
импорт структура
Защиту _checksum (v):
вернуть hashlib.sha256 (hashlib.sha256 (v) .digest ()) дайджеста (). [- 4:]
«»»
Формат строки:
- C32 (Raw формат) в обратном порядке
Raw формат:
- 4 байта контрольной суммы
- N байт данных (Примечание: кодируются для предотвращения скрытых изменений)
- - для сценария:
- - - N байт: длина varint прообразом данные
- - - N байт: данные прообраза
- - - N байт: данные сценария
- - для BIP32 HD родительского ключа:
- - - 32 байта: цепь код
- - - 33 байта: родитель Публичных
- - для BIP32 сериализованного ключа:
- - - 1 байт: Глубина
- - - 4 байта: номер ребенка
- - - 32 байта: цепь код
- - - Один из:
- - - - 32 байта: частные данные ключа
- - - - 33 байт: данные открытых ключей
- 1 байт флага (игнорируется, если неизвестно)
- тип 1 байт
- - 01 скрипт (с данными прообраза)
- - 02 сценария хэш прообраз
- - 03 BIP32 HD родительский ключ
- - 04 BIP32 сериализованная открытый ключ
- 2 байта пространства имен (blockchain идентификатор)
- - 2d41 Bitcoin ( '2bc')
- - 2e01 Namecoin ( '2лс')
- - 2e37 Freicoin ( 'FRC')
«»»
Класс c32d:
__slots__ = ( 'данные', 'нс', 'DTYPE', 'dflag')
Защиту __init __ (я, данные, нс, DTYPE, dflag):
self.data = данные
self.ns = нс
self.dtype = DTYPE
self.dflag = dflag
@classmethod
Защита декодирования (ЦБС, с, сырой = False):
если не сырье:
полный = c32.decode (s [:: - 1])
еще:
полная = ы
CSUM = ByteArray (полное [: 4])
v = ByteArray (полное [4:])
# Кодируйте байты конфигурации, чтобы упростить декодирование
PV = 0xBF
для я в диапазоне (LEN (v) - 1, LEN (v) - 5, -1):
PV = v [г] ^ (CSUM [я% 4]) ^ ру
v [I] = ру
v.append (0xBF)
для я в диапазоне (LEN (v) - 1):
v [г] ^ = CSUM [% я 4] ^ v [I + 1]
V.POP ()
v = байт (v)
если CSUM = _checksum (v):
поднять ValueError ( 'c32d контрольной суммы неправильно')
о = ЦБС (Ничего, Ничего, Ничего, Ничего)
o.data = v [: - 4]
o.dflag = v [-4]
o.dtype = v [-3]
o.ns = struct.unpack ( '! Н', V [-2:]) [0]
вернуться о
Защита закодировать (я, сырой = False):
пытаться:
v = self.data + struct.pack ( '! BBH', self.dflag, self.dtype, self.ns)
кроме struct.error как е:
поднять ValueError (е)
CSUM = ByteArray (_checksum (v))
v = ByteArray (v)
PV = 0xBF
для г в диапазоне (LEN (v) - 1, -1, -1):
PV = v [г] ^ CSUM [я% 4] ^ ру
Если я < LEN (v) - 4:
v [I] = ру
V = CSUM + байт (v)
если сырье:
возврат v
вернуться c32.encode (v) [:: - 1]
расшифровывает = c32d.decode
Защита кодирования (* а, ** ка):
вернуться c32d (* с ** ка) .encode ()
Тест четкости ():
c32.test ()
для (P, S, сырого) в (
((Б '', 0, 0, 0), '1111115Fd9acc', Ь '\ XB5 \ xa5 \ x0c \ xb9 \ x00 \ x00 \ x00 \ x00'),
((B'test», 4232, 142, 219), '955OGe8hOGc97hH4EJj1', Ь '? V \ \\ x1e д / \ x1cq \ XDB \ x8e \ x10 \ x88'),
((Ь '\ XFF' * 0x100, 0xFFFF, 0xff, 0xff), 'YYYYYYc327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGb2cOdG3', Ь '\ XB0 \ xce, * \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x1 2 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ XFF \ XFF \ XFF \ XFF '),
):
(Кф, с) = ({}, р)
для г в диапазоне (2):
о = c32d (* р ** кп)
утверждают o.data == р [0]
утверждают o.ns == р [1]
утверждают o.dtype == р [2]
утверждают o.dflag == р [3]
кп = {
'Данные': р [0],
'Нс': р [1],
'DTYPE': р [2],
'Dflag': р [3],
}
рр = ()
утверждают o.encode () == s
утверждают o.encode (сырые = True) == сырой
Защиту ensureValueError (е):
пытаться:
F ()
кроме ValueError:
проходить
еще:
поднять AssertionError ( «Недопустимый ввод расшифровывает не бросаете ValueError»)
ensureValueError (лямбда: кодирование (б '', -1, 0, 0))
ensureValueError (лямбда: закодировать (б '', 0x10000, 0, 0))
ensureValueError (лямбда: кодирование (б '', 0, -1, 0))
ensureValueError (лямбда: закодировать (б '', 0, 0x100, 0))
ensureValueError (лямбда: кодирование (б '', 0, 0, -1))
ensureValueError (лямбда: закодировать (б '', 0, 0, 0х100))
# Invalid c32d
ensureValueError (лямбда: декодирования ( '1111115Fd9adc'))
ensureValueError (лямбда: декодирования ( '11A1115Fd9acc'))
# Invalid c32
ensureValueError (лямбда: декодирования ( '111x115Fd9acc'))
ensureValueError (лямбда: декодирования ( '1111115Fd9acx'))
если __name__ == '__main__':
контрольная работа()
Распечатать("Испытания прошли")
импорт hashlib
импорт структура
Защиту _checksum (v):
вернуть hashlib.sha256 (hashlib.sha256 (v) .digest ()) дайджеста (). [- 4:]
«»»
Формат строки:
- C32 (Raw формат) в обратном порядке
Raw формат:
- 4 байта контрольной суммы
- N байт данных (Примечание: кодируются для предотвращения скрытых изменений)
- - для сценария:
- - - N байт: длина varint прообразом данные
- - - N байт: данные прообраза
- - - N байт: данные сценария
- - для BIP32 HD родительского ключа:
- - - 32 байта: цепь код
- - - 33 байта: родитель Публичных
- - для BIP32 сериализованного ключа:
- - - 1 байт: Глубина
- - - 4 байта: номер ребенка
- - - 32 байта: цепь код
- - - Один из:
- - - - 32 байта: частные данные ключа
- - - - 33 байт: данные открытых ключей
- 1 байт флага (игнорируется, если неизвестно)
- тип 1 байт
- - 01 скрипт (с данными прообраза)
- - 02 сценария хэш прообраз
- - 03 BIP32 HD родительский ключ
- - 04 BIP32 сериализованная открытый ключ
- 2 байта пространства имен (blockchain идентификатор)
- - 2d41 Bitcoin ( '2bc')
- - 2e01 Namecoin ( '2лс')
- - 2e37 Freicoin ( 'FRC')
«»»
Класс c32d:
__slots__ = ( 'данные', 'нс', 'DTYPE', 'dflag')
Защиту __init __ (я, данные, нс, DTYPE, dflag):
self.data = данные
self.ns = нс
self.dtype = DTYPE
self.dflag = dflag
@classmethod
Защита декодирования (ЦБС, с, сырой = False):
если не сырье:
полный = c32.decode (s [:: - 1])
еще:
полная = ы
CSUM = ByteArray (полное [: 4])
v = ByteArray (полное [4:])
# Кодируйте байты конфигурации, чтобы упростить декодирование
PV = 0xBF
для я в диапазоне (LEN (v) - 1, LEN (v) - 5, -1):
PV = v [г] ^ (CSUM [я% 4]) ^ ру
v [I] = ру
v.append (0xBF)
для я в диапазоне (LEN (v) - 1):
v [г] ^ = CSUM [% я 4] ^ v [I + 1]
V.POP ()
v = байт (v)
если CSUM = _checksum (v):
поднять ValueError ( 'c32d контрольной суммы неправильно')
о = ЦБС (Ничего, Ничего, Ничего, Ничего)
o.data = v [: - 4]
o.dflag = v [-4]
o.dtype = v [-3]
o.ns = struct.unpack ( '! Н', V [-2:]) [0]
вернуться о
Защита закодировать (я, сырой = False):
пытаться:
v = self.data + struct.pack ( '! BBH', self.dflag, self.dtype, self.ns)
кроме struct.error как е:
поднять ValueError (е)
CSUM = ByteArray (_checksum (v))
v = ByteArray (v)
PV = 0xBF
для г в диапазоне (LEN (v) - 1, -1, -1):
PV = v [г] ^ CSUM [я% 4] ^ ру
Если я < LEN (v) - 4:
v [I] = ру
V = CSUM + байт (v)
если сырье:
возврат v
вернуться c32.encode (v) [:: - 1]
расшифровывает = c32d.decode
Защита кодирования (* а, ** ка):
вернуться c32d (* с ** ка) .encode ()
Тест четкости ():
c32.test ()
для (P, S, сырого) в (
((Б '', 0, 0, 0), '1111115Fd9acc', Ь '\ XB5 \ xa5 \ x0c \ xb9 \ x00 \ x00 \ x00 \ x00'),
((B'test», 4232, 142, 219), '955OGe8hOGc97hH4EJj1', Ь '? V \ \\ x1e д / \ x1cq \ XDB \ x8e \ x10 \ x88'),
((Ь '\ XFF' * 0x100, 0xFFFF, 0xff, 0xff), 'YYYYYYc327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGb2cOdG3', Ь '\ XB0 \ xce, * \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x1 2 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ XFF \ XFF \ XFF \ XFF '),
):
(Кф, с) = ({}, р)
для г в диапазоне (2):
о = c32d (* р ** кп)
утверждают o.data == р [0]
утверждают o.ns == р [1]
утверждают o.dtype == р [2]
утверждают o.dflag == р [3]
кп = {
'Данные': р [0],
'Нс': р [1],
'DTYPE': р [2],
'Dflag': р [3],
}
рр = ()
утверждают o.encode () == s
утверждают o.encode (сырые = True) == сырой
Защиту ensureValueError (е):
пытаться:
F ()
кроме ValueError:
проходить
еще:
поднять AssertionError ( «Недопустимый ввод расшифровывает не бросаете ValueError»)
ensureValueError (лямбда: кодирование (б '', -1, 0, 0))
ensureValueError (лямбда: закодировать (б '', 0x10000, 0, 0))
ensureValueError (лямбда: кодирование (б '', 0, -1, 0))
ensureValueError (лямбда: закодировать (б '', 0, 0x100, 0))
ensureValueError (лямбда: кодирование (б '', 0, 0, -1))
ensureValueError (лямбда: закодировать (б '', 0, 0, 0х100))
# Invalid c32d
ensureValueError (лямбда: декодирования ( '1111115Fd9adc'))
ensureValueError (лямбда: декодирования ( '11A1115Fd9acc'))
# Invalid c32
ensureValueError (лямбда: декодирования ( '111x115Fd9acc'))
ensureValueError (лямбда: декодирования ( '1111115Fd9acx'))
если __name__ == '__main__':
контрольная работа()
Распечатать("Испытания прошли")