免责声明:Peoplesoft知识不是必须的,以帮助我这个!
如何从PUBDATALONG列中提取Peoplesoft表中的数据? 表格的描述如下: http://www.go-faster.co.uk/peopletools/psiblogdata.htm
目前我使用的是用Java编写的程序,下面是一段代码:
Inflater inflater = new Inflater();
byte[] result = new byte[rs.getInt("UNCOMPDATALEN")];
inflater.setInput(rs.getBytes("PUBDATALONG"));
int length = inflater.inflate(result);
System.out.println(new String(result, 0, length, "UTF-8"));
System.out.println();
System.out.println("-----");
System.out.println();
我怎么能用Python重写这个? 这是一个在Stackoverflow上以其他形式出现但没有真正答案的问题。 我对Java中代码的作用有基本的了解,但我不知道Python中的任何库我可以用来实现同样的东西。
有些人建议尝试zlib,因为它与Java Inflater类使用的算法兼容,但我没有成功。 考虑PeopleSoft手册中的以下事实:
当PeopleSoft数据库收到消息时,XML数据 转换为UTF-8以防止任何UCS2字节顺序问题。它是 也可以在存储之前使用deflate算法进行压缩 数据库中。
我试过这样的事情:
import zlib
import base64
UNCOMPDATALEN = 362 #this value is taken from the DB and is the dimension of the data after decompression.
PUBDATALONG = '789CB3B1AFC8CD51284B2D2ACECCCFB35532D43350B2B7E3E5B2F130F40C8977770D8977F4710D0A890F0E710C090D8EF70F0D09080DB183C8BAF938BAC707FBBBFB783ADA19DAE86388D904B90687FAC0F4DAD940CD70F67771B533B0D147E6DAE8A3A9D5C76B3F00E2F4355C=='
print zlib.decompress(base64.b64decode(PUBDATALONG), 0, 362)
我得到了这个:
zlib.error:解压缩数据时出错-3:错误的标题检查
我确实做错了什么,但我不够聪明,不能自己搞清楚。
答案 0 :(得分:2)
该字符串不是Base-64编码的。它只是十六进制。 (我不知道为什么它在==
结束,这使它看起来有点像Base-64字符串。)你应该能够通过检查看到没有小写字母,或者就此而言F
之后的大小写字母,因为在典型的Base-64编码的压缩字符串中,即随机出现的数据。
删除末尾的等号,并在Python 2中使用.decode("hex")
,或在Python 3中使用bytes.fromhex()
。