Perl的unpack表示在Java中是什么?

3

我有一个Perl脚本,它接收一个值并将其解包成几个二进制数据属性。以下是示例:

my ( $atr1, $atr2, $atr3, $atr4 ) = unpack('a3a16a32a*', $original_value);

我想知道是否可以用Java的ByteBuffer或其他方式实现相同的功能。
在这个代码片段https://gist.github.com/enrobsop/8403717中已经实现了整数类型的转换,但我还不确定如何处理二进制数据。

它接受一个字符串并将其展开为值列表- https://perldoc.perl.org/functions/unpack。我的情况问题在于二进制数据。 - Switch
1
不要询问如何在 Perl 中翻译某些内容,而是询问如何理解它的作用,或者如何在 Java 中执行某些操作。 - ikegami
@Switch 是的,在评论之前我已经阅读了那篇文章。但是对我来说,“将其扩展为值列表”仍然不清楚。更准确地说,它是基于什么进行扩展的?您能否举一个输入和预期输出的示例? - Federico klez Culloca
1
请参阅此问题的链接:这里 - Håkon Hægland
@Håkon Hægland,Ca非常不同。 a是一个子字符串或切片操作,而C是一种反序列化操作。 - ikegami
显示剩余2条评论
1个回答

4
unpack函数会返回四个字符串。具体来说,它将返回$original_value字符串值的前三个字符作为一个字符串,接下来16个字符作为另一个字符串,再接下来32个字符作为第三个字符串,最后的剩余部分作为第四个和最后一个字符串。换句话说,它将返回字符串的四个切片:一个从字符0..2,一个从字符3..18,一个从字符19..50,以及一个从第51个字符开始到末尾。
请注意,Perl字符串与Java的字符串非常不同。Perl字符串是72位字符的字符串[1],通常用于存储Unicode码点[2]形式的文本和字节。而另一方面,Java字符串是16位字符的字符串,几乎完全用于存储UTF-16字节对形式的文本。
无法确定$original_value中的字符串是文本还是字节(或其他内容),因为上下文不足。如果是字节,则Java等效方法将使用byte值或ByteBuffer对象的数组而不是字符串,并且您需要使用四个调用java.util.Arrays的copyOfRangejava.nio.ByteBuffer的get来执行此操作。如果是文本,则在Java核心中没有直接等效方法(根据我有限且古老的Java知识)。
注释:
1. 内部编码支持72位字符,但实际上只支持32位或64位字符。 2. 每个字符都是[0x000000,0x10FFFF]中的值,这比Java的char支持的要大。例如,length("\N{U+100000}")1

感谢您的回答,"$original_value" 是以文本格式出现的,确切地说,它是一个base64编码的字符串。但我们确定在解压缩(第二个和第三个属性)时包含二进制值。 - Switch
2
Base64对字节进行编码,因此$original_value不包含文本,而是一串字节字符串,因此请使用java.util.Arrays的copyOfRange或java.nio.ByteBuffer的get方法。 - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接