Không có tương ứng "hex nibble" mã cho struct.pack, vì vậy bạn sẽ hoặc là cần phải tự đóng gói vào byte đầu tiên, như:
hex_string = 'abcdef12'
hexdigits = [int(x, 16) for x in hex_string]
data = ''.join(struct.pack('B', (high <<4) + low)
for high, low in zip(hexdigits[::2], hexdigits[1::2]))
Hoặc tốt hơn, bạn chỉ có thể sử dụng codec hex. I E.
>>> data = hex_string.decode('hex')
>>> data
'\xab\xcd\xef\x12'
Để giải nén, bạn có thể mã hóa kết quả lại để hex tương tự
>>> data.encode('hex')
'abcdef12'
Tuy nhiên, lưu ý rằng ví dụ của bạn, có lẽ không cần phải lấy khứ hồi thông qua một đại diện hex ở tất cả khi mã hóa. Chỉ cần sử dụng trực tiếp thông tin nhị phân md5. I E.
>>> x = md5.md5('some string')
>>> x.digest()
'Z\xc7I\xfb\xee\xc96\x07\xfc(\xd6f\xbe\x85\xe7:'
Điều này tương đương với đại diện gói() của bạn. Để có được đại diện hex, sử dụng phương pháp giải nén tương tự trên:
>>> x.digest().decode('hex')
'acbd18db4cc2f85cedef654fccc4a4d8'
>>> x.hexdigest()
'acbd18db4cc2f85cedef654fccc4a4d8'
[Chỉnh sửa]: Cập nhật để sử dụng phương pháp tốt hơn (hex codec)
bạn có thuật ngữ của bạn bị nhầm lẫn khủng khiếp. – hop
@hop: Khác với "hex nhị phân", tất cả đều OK. Chỉ có một chút khác biệt về từ vựng chéo. Nó làm tôi bối rối lúc đầu cho đến khi tôi đọc định nghĩa của gói PHP(), nhưng nó chỉ là vấn đề của các thuật ngữ khác nhau được sử dụng. – Brian