У меня есть код perl (скажем, клиент), который отправляет упакованные данные как HTTP POST в другой код perl, запущенный на модуле apache mod_perl (например, сервер).
На стороне клиента у меня есть такая функция пакета,
$postData = pack("N a*", length($metaData), $metaData);
Кажется, из документа perl pack,
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 User Agent.
На стороне сервера 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). Я искал Google для этого и, похоже, это не единственное линейное решение, как в perl. Некоторые предложили написать нашу собственную функцию распаковки. Я использую версию java 1.7.
Есть ли какое-либо простое решение, доступное в java для анализа данных на стороне сервера выше?
Редактировать: Спасибо Эллиот за идею "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.
потенциально JBBP может быть таким
final int value = JBBPParser.prepare("int;").parse(theInputStream).findFieldForType(JBBPFieldInt.class).getAsInt();