【问题标题】:Java equivalent of perl unpack functionJava 等价于 perl 解包函数
【发布时间】: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 的解决方案更新了我的问题。好不好请看一下。
  • 在我看来是合理的。

标签: java perl


【解决方案1】:

JBBP 可能就是这样一个

final int value = JBBPParser.prepare("int;").parse(theInputStream).findFieldForType(JBBPFieldInt.class).getAsInt();

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多