如何将十六进制声明分解为相同大小的块?

时间:2014-09-11 06:33:40

标签: python hex

我的代码中有以下声明:

plain_text = 0x3243f6a8885a308d313198a2e03707343243f6a8885a308d313198a2e037073454a2e

我想分成相同大小的块,比如每个32个长度,这样我就有以下三个部分:

part1 = 0x3243f6a8885a308d313198a2e0370734
part2 = 0x3243f6a8885a308d313198a2e0370734
part3 = 0x54a2e

请注意,我的输入和输出都不是字符串。此外,如果明文的总长度不是所需的大小,最后一部分不会被丢弃,而是按原样复制(到某些partn)。

实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

显而易见的事情是转移和掩盖。

如果你想要最低的16个字节,然后是下一个最低的等等,顶部不完整,那就更容易了,所以让我们先做:

bits = []
while plain_text:
    bits.append(plain_text & ((1 << 128) - 1))
    plain_text >>= 128
bits.reverse()

相反,看起来你想要最高16字节等,让最小部分不完整而不是最大。但这不是什么大不了的事。唯一棘手的部分是知道开始使用什么掩码,你可以用plain_text.bit_length()得到它(或者,如果你使用旧版本的Python,通过使用显示的等效代码手动执行相同的操作文档)。此外,看起来你想要分割半字节而不是字节,但这也不是太难:

bits = []
shift = (math.ceil(plain_text.bit_length() / 4) % 32) * 4
while plain_text:
    bits.append(plain_text & (1 << shift) - 1)
    plain_text >>= shift
    shift = 128
bits.reverse()

有效吗?

>>> part1, part2, part3 = bits
>>> hex(part1), hex(part2), hex(part3)
('0x3243f6a8885a308d313198a2e0370734',
 '0x3243f6a8885a308d313198a2e0370734',
 '0x54a2e')

作为旁注,我有点担心您要将其存储在名为part1part2part3的变量中,而不仅仅是名为{{1 (或parts)。如果bits稍微大一点并且不适合3个部分,你打算做什么?

答案 1 :(得分:0)

您可以使用textwrap.wrap

>>> import textwrap
>>> plain_text = 0x3243f6a8885a308d313198a2e03707343243f6a8885a308d313198a2e037073454a2e
>>> output = [int(x, 16) for x in textwrap.wrap(format(plain_text, 'x'), 32)]
>>> output
[66814286504060421741230023322616923956L, 66814286504060421741230023322616923956L, 346670]
>>> for x in output:
...     print format(x, 'x')
...     
3243f6a8885a308d313198a2e0370734
3243f6a8885a308d313198a2e0370734
54a2e
相关问题