Байты и целые числа и конкатенация и Python - PullRequest
4 голосов
/ 04 января 2011

У меня есть 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, это было бы очень признательно

Ответы [ 3 ]

6 голосов
/ 04 января 2011
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']
2 голосов
/ 04 января 2011
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

несложно, однако, точно иметь дело с представлением, которое вы показали в своем ответе, если вы хотите

edit:

вот чтоСкотт Гриффитс сказал.Он прав;)

"

Использование шестнадцатеричного числа работает только здесь, потому что числа достаточно велики, чтобы потребовать 8 шестнадцатеричных цифр. Нам нужно использовать формат, напримердополнить гекс до восьми нулями.

"

1 голос
/ 04 января 2011

Это даст вам список всех значений, которые вы хотите,

>>> [777007543 >> i & 0xff for i in xrange(24,0,-8)] + \
... [114997259 >> i & 0xff for i in xrange(24,0,-8)] + \
... map(ord, stringofbytes)

или даже лучше (из другого потока , который вы начали),

>>> struct.unpack('>12B', \
... struct.pack('>L', 777007543) + struct.pack('>L', 114997259) + '.P1\xb7')

Если вы хотите сделать эту строку для передачи в ваш хэш md5,

>>> map(chr, _)

Я предполагаю, что каждый байт строки должен представлять 1-байтовое число.

...