2010-07-11 4 views
3

En C#, je peux jeter des choses à 8bit ints signés comme ceci:Simuler C# de sbyte (8 bits entier signé) coulée en Python

(sbyte)arg1; 

qui, lorsqu'il est arg1 = 2, le rendement de la distribution 2 également. Cependant, évidemment, la diffusion 128 renverra -128. Plus spécifiquement, la diffusion 251 renverra -5.

Quelle est la meilleure façon d'émuler ce comportement?

Edit: Trouvé une double question: Typecasting in Python

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

Répondre

3

Avec ctypes:

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

j'utiliser le module struct de la bibliothèque standard Python, qui, comme si souvent, est très pratique pour transformer les valeurs en octets et vice-versa:

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

Hmm c'est plus lent que la méthode que j'ai trouvée dans mon OP: S. –

0

struct module peut vous aider, par exemple voici un moyen de convertir int (4 octets) à 4 signé octets

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

Des idées sur le dessus de votre tête à quelle vitesse cela serait comparé à d'autres solutions? Jamais utilisé numpy. –

+0

Chargement NumPy prend quelques secondes, mais ses routines sont implémentées en C et Fortran. –

+0

Hmm curieusement c'est plus lent que la méthode d'Alex, et celle que j'ai trouvée dans l'OP –

0

Essayez une des options suivantes:

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

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