我有一个Perl脚本,它接收一个值并将其解包成几个二进制数据属性。以下是示例:
my ( $atr1, $atr2, $atr3, $atr4 ) = unpack('a3a16a32a*', $original_value);
我想知道是否可以用Java的
ByteBuffer
或其他方式实现相同的功能。在这个代码片段https://gist.github.com/enrobsop/8403717中已经实现了整数类型的转换,但我还不确定如何处理二进制数据。
我有一个Perl脚本,它接收一个值并将其解包成几个二进制数据属性。以下是示例:
my ( $atr1, $atr2, $atr3, $atr4 ) = unpack('a3a16a32a*', $original_value);
ByteBuffer
或其他方式实现相同的功能。unpack
函数会返回四个字符串。具体来说,它将返回$original_value
字符串值的前三个字符作为一个字符串,接下来16个字符作为另一个字符串,再接下来32个字符作为第三个字符串,最后的剩余部分作为第四个和最后一个字符串。换句话说,它将返回字符串的四个切片:一个从字符0..2,一个从字符3..18,一个从字符19..50,以及一个从第51个字符开始到末尾。$original_value
中的字符串是文本还是字节(或其他内容),因为上下文不足。如果是字节,则Java等效方法将使用byte
值或ByteBuffer
对象的数组而不是字符串,并且您需要使用四个调用java.util.Arrays的copyOfRange
或java.nio.ByteBuffer的get
来执行此操作。如果是文本,则在Java核心中没有直接等效方法(根据我有限且古老的Java知识)。char
支持的要大。例如,length("\N{U+100000}")
是1
。$original_value
不包含文本,而是一串字节字符串,因此请使用java.util.Arrays的copyOfRange
或java.nio.ByteBuffer的get
方法。 - ikegami
C
与a
非常不同。a
是一个子字符串或切片操作,而C
是一种反序列化操作。 - ikegami