C# Python中的十六进制位移位
我试图理解如何在Python中执行位移位操作。来自C#,它的工作方式不同 C#代码是 输出为C# Python中的十六进制位移位,c#,python,C#,Python,我试图理解如何在Python中执行位移位操作。来自C#,它的工作方式不同 C#代码是 输出为 000abcdef0000000 00000000000abcde Python中的等价词是什么?我试过了 plain = 0xabcdef0000000 key = 0xf0f0f0f0f123456 print plain left = plain right = plain >> 32 print hex(left) print hex(right) 但是,它不起作用。Py
000abcdef0000000 00000000000abcde
Python中的等价词是什么?我试过了
plain = 0xabcdef0000000
key = 0xf0f0f0f0f123456
print plain
left = plain
right = plain >> 32
print hex(left)
print hex(right)
但是,它不起作用。Python中的输出是不同的。缺少0的填充。任何帮助都将不胜感激 我对你没意见你试过了
>>> hex(0xabcdef0000000)
'0xabcdef0000000'
>>> hex(0xabcdef0000000 >> 32)
'0xabcde'
我对你没意见你试过了
>>> hex(0xabcdef0000000)
'0xabcdef0000000'
>>> hex(0xabcdef0000000 >> 32)
'0xabcde'
如果
然后
如果
然后
函数不使用前导零填充数字,因为Python整数是无界的。C#整数有固定的大小(本例中为64位),因此有一个上限,因此可以进行填充。这并不意味着那些额外的填充零有任何意义;整数值是相同的
您必须使用format()
函数显式添加这些零以生成输出:
print format(left, '#018x')
print format(right, '#018x')
>>> print format(left, '#018x')
0x000abcdef0000000
>>> print format(right, '#018x')
0x0000000000abcde
#
告诉format()
在字段宽度要求format()
填充输出之前包括0x
前缀和前导0
:
print format(left, '#018x')
print format(right, '#018x')
>>> print format(left, '#018x')
0x000abcdef0000000
>>> print format(right, '#018x')
0x0000000000abcde
注意,宽度包括0x
前缀;该输出中有16个十六进制数字,表示64位数据
如果您想使用基于键中使用的字符数的动态宽度,请根据;每4位产生一个十六进制字符:
format(right, '#0{}x'.format((key.bit_length() + 3) // 4 + 2))
演示:
但请注意,即使键的长度只有60位,C也会用0
填充该值。函数hex()
不会用前导零填充数字,因为Python整数是无界的。C#整数有固定的大小(本例中为64位),因此有一个上限,因此可以进行填充。这并不意味着那些额外的填充零有任何意义;整数值是相同的
您必须使用format()
函数显式添加这些零以生成输出:
print format(left, '#018x')
print format(right, '#018x')
>>> print format(left, '#018x')
0x000abcdef0000000
>>> print format(right, '#018x')
0x0000000000abcde
#
告诉format()
在字段宽度要求format()
填充输出之前包括0x
前缀和前导0
:
print format(left, '#018x')
print format(right, '#018x')
>>> print format(left, '#018x')
0x000abcdef0000000
>>> print format(right, '#018x')
0x0000000000abcde
注意,宽度包括0x
前缀;该输出中有16个十六进制数字,表示64位数据
如果您想使用基于键中使用的字符数的动态宽度,请根据;每4位产生一个十六进制字符:
format(right, '#0{}x'.format((key.bit_length() + 3) // 4 + 2))
演示:
但请注意,即使键的长度只有60位,C#也会用0
填充该值。什么是“它不工作”?我没有得到与Python版本相同的输出。缺少填充的0。但是您知道0x00000000000abcde==0xabcde
,对吗?无论如何,对于打印,string formatting
就可以了。是的,但是0xabcdef!=0xabcde
@TomSothcott:那么在您的C代码中,您在哪里看到了0x0000000000abcdef
?将0xabcdef0000000
32位向右移位仍然会导致打印0x00000000abcde
,因为这是生成的64位值。最后8位被移走了。到底什么意思是“它不工作”?我没有得到与Python版本相同的输出。缺少填充的0。但是您知道0x00000000000abcde==0xabcde
,对吗?无论如何,对于打印,string formatting
就可以了。是的,但是0xabcdef!=0xabcde
@TomSothcott:那么在您的C代码中,您在哪里看到了0x0000000000abcdef
?将0xabcdef0000000
32位向右移位仍然会导致打印0x00000000abcde
,因为这是生成的64位值。最后8位被移开。