我有2个32位无符号整数..
777007543 和 114997259
和字节串..
0x47 0x30 0x22 0x2D 0x5A 0x3F 0x47 0x58
如何让python给我这些3的连接,以便我...
0x2E 0x50 0x31 0xB7 0x06 0xDA 0xB8 0x0B 0x47 0x30 0x22 0x2D 0x5A 0x3F 0x47 0x58
然后我会通过md5哈希运行它并获得...
0x30 0x73 0x74 0x33 0x52 0x6C 0x26 0x71 0x2D 0x32 0x5A 0x55 0x5E 0x77 0x65 0x75
如果有人可以在python代码中运行它,那将非常感激
答案 0 :(得分:6)
import struct
import hashlib
x = struct.pack('>II8B', 777007543, 114997259, 0x47, 0x30, 0x22, 0x2D, 0x5A, 0x3F, 0x47, 0x58)
hash = hashlib.md5(x).digest()
print [hex(ord(d)) for d in x]
(output) ['0x2e', '0x50', '0x31', '0xb7', '0x6', '0xda', '0xb8', '0xb', '0x47', '0x30', '0x22', '0x2d', '0x5a', '0x3f', '0x47', '0x58']
print [hex(ord(d)) for d in hash]
(output) ['0x30', '0x73', '0x74', '0x33', '0x52', '0x6c', '0x26', '0x71', '0x2d', '0x32', '0x5a', '0x55', '0x5e', '0x77', '0x65', '0x75']
答案 1 :(得分:2)
q = hex(777007543) + hex(114997259)[2:] + '4730222d5a3f4758'
就这样做。这就是它起作用的原因:
>>> num1, num2
(777007543, 114997259)
>>> hex(num1), hex(num2)
('0x2e5031b7', '0x6dab80b')
>>> hex(num1) + hex(num2) + '0x4730222d5a3f4758'
'0x2e5031b70x6dab80b0x4730222d5a3f4758'
>>> hex(num1) + hex(num2)[2:] + '4730222d5a3f4758'
'0x2e5031b76dab80b4730222d5a3f4758'
>>> int(_, 16)
3847554995347152223960862296285071192L
然而,如果你想要,那么准确地处理你在答案中所表现的表现并不困难
编辑:
这是scott griffhits所说的。他是对的;)
“
使用hex仅适用于此处,因为 数字足够大,需要8个十六进制 数字。我们需要使用一种格式 示例
'{0:08x}{1:08x}'.format(num1, num2)
将填充十六进制 八个零。“
答案 2 :(得分:1)
这将为您提供所需的所有值的列表
>>> [777007543 >> i & 0xff for i in xrange(24,0,-8)] + \
... [114997259 >> i & 0xff for i in xrange(24,0,-8)] + \
... map(ord, stringofbytes)
甚至更好(来自您开始的other thread),
>>> struct.unpack('>12B', \
... struct.pack('>L', 777007543) + struct.pack('>L', 114997259) + '.P1\xb7')
如果您想将此字符串传递给md5哈希,
>>> map(chr, _)
我假设字符串的每个字节都应该代表一个1byte的数字。