我有一个十六进制字符串,我想一次打印出 32 个字符,从右到左。例如
11010401c3cf0e0e383434d0c0c302c2cb0a0a28242490808201c1c7060618141450404100c0c302020804041
应打印为
60618141450404100c0c302020804041
0c302c2cb0a0a28242490808201c1c70
000000011010401c3cf0e0e383434d0c
我尝试过:
for i in range(len(hex_str)//32+1):
print(hex_str[-32*(i+1):-32*i].zfill(32))
但这给出了错误的输出:
00000000000000000000000000000000
0c302c2cb0a0a28242490808201c1c70
000000011010401c3cf0e0e383434d0c
这是因为在第一次迭代中,
-32*i
的计算结果为0,因此切片是hex_str[-32:0]
,返回None
。我知道正确的语法是 hex_str[-32:]
,但是如何在这样的循环中得到它?我最好的解决方案是
for i in range(len(inject)//32+1):
print(hex_str[-32*(i+1):-32*i or None].zfill(32))
虽然感觉很丑。我应该接受这种感觉吗?还是有一些我没有意识到的东西?
-32*i or None
很有趣 - 有时很容易忘记您没有有使用负索引等便利功能。
print(hex_str[-32*(i+1):len(hex_str)-32*i].zfill(32))
另一个值得考虑的无聊选择:
i = len(hex_str) - 32
while i > 0:
print(hex_str[i:i+32])
print(hex_str[:i].zfill(32))
而不是这个:
len(inject)//32+1
这个: (len(注入)+31)//32
示例:
s = "11010401c3cf0e0e383434d0c0c302c2cb0a0a28242490808201c1c7060618141450404100c0c302020804041"
for i in range((len(s) + 31)//32):
print(s[i*32:(i+1)*32])
结果:
11010401c3cf0e0e383434d0c0c302c2
cb0a0a28242490808201c1c706061814
1450404100c0c302020804041