2011-01-04 2 views
4

у меня есть 2 32-битные целые числа без знака ..Bytes и целых и конкатенации и питона

и

и строка байтов ..

0x47 0x30 0x22 0x2D 0x5A 0x3F 0x47 0x58

Как получить питона, чтобы дать мне конкатенацию этих 3 таким образом, что у меня есть ...

0x2E 0x50 0x31 0x06 0xB7 0xDA 0xb8 0x0B 0x47 0x30 0x22 0x2D 0x5A 0x3F 0x47 0x58

Я бы тогда запустить, что через md5 хэш и получить ...

0x30 0x73 0x74 0x33 0x52 0x26 0x71 0x6C 0x2D 0x32 0x5A 0x55 0x77 0x65 0x5e 0x75

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

+2

Python 2 или Python 3? И что именно вы подразумеваете под «строкой байтов»? –

+0

если я печатаю это выглядит как b '....' Его последние 8 байтов, полученные через сокет – user558383

+0

, вероятно, python 3 – user558383

ответ

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'] 
+0

+1: struct.pack. Ручки большие и маленькие, так изящно. –

+0

http://stackoverflow.com/questions/3828527/websockets-in-python3-1-handshake-problem - ha кто-то связался с моим блогом на этом сайте, жалуясь, что моя реализация не работает ... ну, в любом случае, это так или иначе ! Хотя это выглядит как http://stackoverflow.com/users/471795/kanaka, это уже сделано. – user558383

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 

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

редактировать:

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

"

Используя шестигранный работает здесь только потому, что число достаточно велики, чтобы нужна 8 шестигранных цифры Мы должны использовать формат, для примера '{0:08x}{1:08x}'.format(num1, num2) дополнит шестигранное с до восемь нулей.

"

+0

Использование 'hex' работает здесь только потому, что числа достаточно велики, чтобы иметь 8 шестнадцатеричных цифр. Для меньших чисел вам понадобится «формат», чтобы получить правильную нумерацию нулей. –

+0

Да, это правильно .. – Ant

+0

Например, '' {0: 08x} {1: 08x} '. Format (num1, num2) 'будет колотить шестнадцатеричный до восьми нулей. –

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, _) 

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

Смежные вопросы