如何在Python中夸大一些被Peoplesoft(Java)收缩的数据?

时间:2017-03-22 08:10:20

标签: java guid deflate inflate peoplesoft

免责声明: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:错误的标题检查

我确实做错了什么,但我不够聪明,不能自己搞清楚。

1 个答案:

答案 0 :(得分:2)

该字符串不是Base-64编码的。它只是十六进制。 (我不知道为什么它在==结束,这使它看起来有点像Base-64字符串。)你应该能够通过检查看到没有小写字母,或者就此而言F之后的大小写字母,因为在典型的Base-64编码的压缩字符串中,即随机出现的数据。

删除末尾的等号,并在Python 2中使用.decode("hex"),或在Python 3中使用bytes.fromhex()