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

时间:2010-07-11 06:24:36

标签: c# python casting

在C#中,我可以将内容转换为8位签名的内容,如下所示:

(sbyte)arg1;

arg1 = 2时,演员也返回2。但是,显然投射128将返回-128。更具体地说,投射251将返回-5

模仿此行为的最佳方式是什么?

修改:发现一个重复的问题:Typecasting in Python

s8 = (i + 2**7) % 2**8 - 2**7      // convert to signed 8-bit

5 个答案:

答案 0 :(得分:3)

使用ctypes:

from ctypes import cast, pointer, c_int32, c_byte, POINTER
cast(pointer(c_int32(arg1)), POINTER(c_byte)).contents.value

答案 1 :(得分:2)

我使用Python标准库的struct模块,因为它经常用于将值转换为字节,反之亦然:

>>> def cast_sbyte(anint):
    return struct.unpack('b', struct.pack('<i', anint)[0])[0]
... ... 
>>> cast_sbyte(251)
-5

答案 2 :(得分:0)

struct模块可以帮助您,例如这是一种将int(4字节)转换为4个有符号字节的方法

>>> import struct
>>> struct.pack('i',251)
'\xfb\x00\x00\x00'
>>> s=struct.pack('i',251)
>>> print struct.unpack('bbbb',s)
(-5, 0, 0, 0)

答案 3 :(得分:0)

>>> from numpy import int8
>>> int8(251)
-5

答案 4 :(得分:0)

请尝试以下方法之一:

>>> sbyte=lambda n:(255 & n^128)-128 
>>> # or sbyte=lambda n:(n+128 & 255)-128

>>> sbyte(251)
-5
>>> sbyte(2)
2