在Jython 2.5.3中进行投射

时间:2016-05-08 14:54:56

标签: casting apache-pig jython ctypes

有一个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函数。该问题是否有解决方法?

谢谢, 斯特芬

1 个答案:

答案 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)