字节、整数、拼接和Python

4

我有两个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代码中运行它,那将不胜感激。


2
Python 2 还是 Python 3?你所说的“字节串”具体指什么? - Tim Pietzcker
如果我打印它,它看起来像b'....'。这是通过套接字接收到的最后8个字节。 - user558383
3
“可能是 Python 3”?有趣。请执行 import sys; sys.version 命令并告诉我答案即可。"probably" 是无用和没有信息量的。 - S.Lott
1
@user 在Python 3中,字符串发生了根本性的变化。对于这个问题的任何答案都将具体针对2或3版本。因此,除非您想同时支持两个版本(如果是这样,您应该有充分的理由),否则您确实需要决定使用哪个版本并让我们知道。 - moinudin
@S.Lott: “inoformative”? +1 发明新词来责骂新用户。 :-) - JS.
3个回答

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: struct.pack。优雅地处理大端和小端。 - S.Lott
有人在这个网站上链接到了我的博客,抱怨我的WebSocket实现无法工作...嗯,现在它确实能工作了!尽管看起来已经有人做过了。 - 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

如果您愿意,处理您在回答中展示的表示方式并不困难。

编辑:

这是Scott Griffhits所说的。他是正确的;)

"

仅使用十六进制在此处有效,因为数字足够大需要8个十六进制数字。我们需要使用格式,例如'{0:08x}{1:08x}'.format(num1,num2)将十六进制填充最多八个零。

"


只有使用 hex 才能在这里工作,因为数字足够大需要 8 个十六进制数字。对于较小的数字,您需要使用 format 来使其正确地填充零。 - Scott Griffiths
例如 '{0:08x}{1:08x}'.format(num1, num2) 将会在十六进制数前面填充最多八个零。 - Scott Griffiths

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接