2016-05-08 13 views
0

Es gibt eine Python-Funktion, die in CPython 2.5.3 läuft, aber in Jython 2.5.3 abstürzt. Es ist Teil einer benutzerdefinierten Funktion in Apache Pig, die Jython 2.5.3 verwendet, so dass ich es nicht ändern kann.Casting in Jython 2.5.3

Die Eingabe ist ein Array von singed Bytes, aber in Wirklichkeit sind das Bytes ohne Vorzeichen, also muss ich es umwandeln.

from StringIO import StringIO 
import array 
import ctypes 

assert isinstance(input, array.array), 'unexpected input parameter' 
assert input.typecode == 'b', 'unexpected input type' 

buffer = StringIO() 
for byte in input: 
    s_byte = ctypes.c_byte(byte) 
    s_byte_p = ctypes.pointer(s_byte) 
    u_byte = ctypes.cast(s_byte_p, ctypes.POINTER(ctypes.c_ubyte)).contents.value 
    buffer.write(chr(u_byte)) 
buffer.seek(0) 
output = buffer.getvalue() 

assert isinstance(output, str) 

Der Fehler ist:

s_byte = ctypes.cast(u_byte_p, ctypes.POINTER(ctypes.c_byte)).contents.value 
AttributeError: 'module' object has no attribute 'cast' 

ich die ctypes.cast Funktionen erraten ist nicht implemeted in Jython 2.5.3. Gibt es eine Problemumgehung für dieses Problem?

Danke, Steffen

+0

Dieser Code kann wahrscheinlich 'struct.unpack' und' struct.pack' mit neu implementiert werden, siehe [struct module] (https://docs.python.org/2/library/struct.html) –

Antwort

0

Hier ist meine Lösung, das ist ziemlich hässlich, aber funktioniert ohne zusätzliche dependecies. Es verwendet die Bitdarstellung von usinged und signed bytes (https://de.wikipedia.org/wiki/Zweierkomplement).

import array 

assert isinstance(input, array.array), 'unexpected input parameter' 
assert input.typecode == 'b', 'unexpected input type' 

output = array.array('b', []) 

for byte in input: 

    if byte > 127: 
     byte = byte & 127 
     byte = -128 + byte 

    output.append(byte)