在Python中模拟C#的sbyte(8位有符号整数)转换
在C#中,我可以把东西转换成8位带符号整数,方法如下:
(sbyte)arg1;
当arg1 = 2
时,这个转换也会返回2。不过,显然如果转换128
,结果会是-128
。更具体地说,如果转换251
,结果会是-5
。
有什么好的方法可以模拟这种行为呢?
补充:发现了一个重复的问题:Python中的类型转换
s8 = (i + 2**7) % 2**8 - 2**7 // convert to signed 8-bit
5 个回答
0
试试下面的其中一个:
>>> sbyte=lambda n:(255 & n^128)-128
>>> # or sbyte=lambda n:(n+128 & 255)-128
>>> sbyte(251)
-5
>>> sbyte(2)
2
2
我会使用Python标准库中的struct
模块。这个模块非常有用,可以帮助我们把数值转换成字节,或者把字节转换回数值。
>>> def cast_sbyte(anint):
return struct.unpack('b', struct.pack('<i', anint)[0])[0]
... ...
>>> cast_sbyte(251)
-5
3
使用ctypes:
from ctypes import cast, pointer, c_int32, c_byte, POINTER
cast(pointer(c_int32(arg1)), POINTER(c_byte)).contents.value