C# Python中的十六进制位移位

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

我试图理解如何在Python中执行位移位操作。来自C#,它的工作方式不同

C#代码是

输出为

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位被移开。