Jython2.5.3中的铸造

ulmd4ohb  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(357)

有一个python函数,在cpython2.5.3中运行,但在jython2.5.3中崩溃。它是ApachePig中用户定义函数的一部分,ApachePig使用Jython2.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'

我猜ctypes.cast函数没有在Jython2.5.3中实现。有解决这个问题的办法吗?
谢谢,史蒂芬

9ceoxa92

9ceoxa921#

这是我的解决方案,这是相当丑陋的,但没有额外的依赖工程。它使用usinged和signed字节的位表示(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)

相关问题