【发布时间】:2014-08-15 13:13:42
【问题描述】:
我有一个 perl 代码(比如客户端),它将打包数据作为 HTTP POST 发送到另一个运行在 apache mod_perl 模块(比如服务器)上的 perl 代码。
在客户端,我有这样的打包功能,
$postData = pack("N a*", length($metaData), $metaData);
从perl包文件看来,
N -> An unsigned long (32-bit) in "network" (big-endian) order.
a -> A string with arbitrary binary data, will be null padded.
现在 $postData 将使用 perl LWP 用户代理发送到服务器。
在服务器端perl中,我们以前是这样解包的,
# first reading the metaData Length
my $buf;
$request->read($buf, 4); #$request is apache request handler
my $metaDataLength = unpack("N", $buf);
# now read the metaData itself
$request->read($buf, $metaDataLength);
现在我必须在 java 中做这个服务器端数据解析(由于某些原因离开 perl)。我已经在谷歌上搜索了这个,它似乎不是 perl 中的单行解决方案。有人建议编写我们自己的解包函数。我正在使用 java 1.7 版本。
对于上面的服务器端数据解析,java中是否有任何简单的解决方案?
编辑:感谢 Elliot 提出“ByteBuffer”的想法。以下代码对我来说很好,
InputStream is = request.getInputStream(); //request is HTTPServletRequest
byte[] bArr = new byte[4]; //reading first 4 bytes to get metaDataLength
int bytesRead = is.read(bArr);
ByteBuffer buf = ByteBuffer.wrap(bArr);
int metaDataLength = buf.getInt(); //shows value matches with clientside perl code.
【问题讨论】:
-
你可以从jerl开始。
-
@ElliottFrisch,因为我们计划离开 perl,我不认为 'jerl' 是正确的方法。你能在java中单独为这个“解包”提出一些建议吗?
-
不是直接的,也不是简单的。您可以(大概)使用ByteBuffer 来做到这一点。
-
@ElliottFrisch,感谢您的想法。我已经用基于 ByteBuffer 的解决方案更新了我的问题。好不好请看一下。
-
在我看来是合理的。