字节与整数、连接与 Python

4 投票
3 回答
6083 浏览
提问于 2025-04-16 09:23

我有两个32位的无符号整数:

777007543 和 114997259

还有一串字节:

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

我想知道怎么用Python把这三部分连接起来,得到:

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 个回答

1

这段代码会给你一个你想要的所有值的列表,

>>> [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字节的数字。

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

其实处理你在回答中展示的那种表示方式并不难,如果你想的话。

补充:

这是斯科特·格里菲斯说的。他说得对;)

"

使用十六进制在这里有效,是因为这些数字足够大,需要用到8位十六进制数字。我们需要使用一种格式,比如 '{0:08x}{1:08x}'.format(num1, num2) 这样可以在十六进制前面填充最多八个零。

"

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

撰写回答