Существует также более простая причина для этого, чем просто ошибки или дисковое повреждение и т.д. Я думаю это, наиболее вероятная причина для этого для случая состоит в том, когда кто-то пишет рекурсивную текстовую замену на рабочей копии без исключения .svn файлы.
Это означает нетронутые копии файлов (в основном Базовая версия файлов, это сохранило в .svn административной области), изменяются, и это делает недействительным сумму MD5.
Преграды @Andrew: это также объясняет, почему Ваше решение фиксирует это.
Другой способ:
import math
def hextobinary(hex_string):
s = int(hex_string, 16)
num_digits = int(math.ceil(math.log(s) / math.log(2)))
digit_lst = ['0'] * num_digits
idx = num_digits
while s > 0:
idx -= 1
if s % 2 == 1: digit_lst[idx] = '1'
s = s / 2
return ''.join(digit_lst)
print hextobinary('abc123efff')
Замените каждую шестнадцатеричную цифру соответствующими 4 двоичными цифрами:
1 - 0001
2 - 0010
...
a - 1010
b - 1011
...
f - 1111
Вот довольно простой способ сделать это использование перестановки битов для генерации двоичных строк.
Ключевой бит, который необходимо понять:
(n & (1 << i)) and 1
Который будет генерировать либо 0, либо 1, если установлен i-й бит числа n.
import binascii
def byte_to_binary(n):
return ''.join(str((n & (1 << i)) and 1) for i in reversed(range(8)))
def hex_to_binary(h):
return ''.join(byte_to_binary(ord(b)) for b in binascii.unhexlify(h))
print hex_to_binary('abc123efff')
>>> 1010101111000001001000111110111111111111
Изменить: используя "новый" "тернарный оператор this:
(n & (1 << i)) and 1
Превратится в:
1 if n & (1 << i) or 0
(Какой TBH я не уверен, насколько он читабелен)
import binascii
binary_string = binascii.unhexlify(hex_string)
Чтение
Возвращает двоичные данные, представленные шестнадцатеричной строкой, указанной в качестве параметра.
шестнадцатеричный -> десятичный, затем десятичный -> двоичный
#decimal to binary
def d2b(n):
bStr = ''
if n < 0: raise ValueError, "must be a positive integer"
if n == 0: return '0'
while n > 0:
bStr = str(n % 2) + bStr
n = n >> 1
return bStr
#hex to binary
def h2b(hex):
return d2b(int(hex,16))