【问题标题】:Bytes and integers and concatenation and python字节和整数以及连接和python
【发布时间】:2011-01-04 15:16:12
【问题描述】:

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

【问题讨论】:

  • Python 2 还是 Python 3? “字节串”到底是什么意思?
  • 如果我打印它看起来像 b'....' 它是通过套接字接收的最后 8 个字节
  • “可能是 python 3”?有趣的。你能做import sys; sys.version 并发布答案吗? “可能”是无用的和提供信息的。
  • @user 字符串在 Python 3 中发生了根本性的变化。这个问题的任何答案都将特定于 2 或 3。所以除非你想同时支持两者(如果是这样,你应该有充分的理由) 您确实需要确定您使用的是哪一个并让我们知道。
  • @S.Lott:“信息丰富”? +1 发明词来斥责新用户。 :-)

标签: python byte md5


【解决方案1】:
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】:
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) 将用最多填充十六进制 八个零。

"

【讨论】:

  • 使用hex 仅在此处有效,因为数字足够大,需要 8 个十六进制数字。对于较小的数字,您需要一个 format 以使其正确填充零。
  • 例如'{0:08x}{1:08x}'.format(num1, num2) 将用最多八个零填充十六进制。
【解决方案3】:

这将为您提供所需的所有值的列表,

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

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 2012-07-18
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多