有一个Python函数,它在CPython 2.5.3中运行但在Jython 2.5.3中崩溃。 它是Apache Pig中用户定义函数的一部分,它使用Jython 2.5.3,所以我无法改变它。
输入是一个有字节的字节数组,但事实上它是无符号字节,所以我需要将其强制转换。
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)
错误是:
s_byte = ctypes.cast(u_byte_p, ctypes.POINTER(ctypes.c_byte)).contents.value
AttributeError: 'module' object has no attribute 'cast'
我想在Jython 2.5.3中没有实现ctypes.cast函数。该问题是否有解决方法?
谢谢, 斯特芬
答案 0 :(得分:0)
这是我的解决方案,这是非常难看的,但没有额外的依赖。 它使用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)