在Python中模拟C#的sbyte(8位有符号整数)转换

3 投票
5 回答
1601 浏览
提问于 2025-04-16 01:07

在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

撰写回答