我正在尝试将perl脚本重写为java。此脚本中有一行包含pack函数:
my $key = '0rdR-0PrdK';
$key = pack("H*", $key);
我在java中使用的方法是:
private static byte[] hexToBytes(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i + 1), 16));
}
return data;
}
它在十六进制字符串上正常工作,但在非十六进制字符串上不工作
左边是java接收的字节,右边是perl'0rdr-0prdk'
-1 11
-49 -37
-16 -48
-17 -101
-49 -44
你们有谁有这样的问题吗?如何解决?
2条答案
按热度按时间uz75evzq1#
pack("H*", '0rdR-0PrdK')
产生垃圾。这是不可能的
0rdR-0PrdK
从输出pack("H*", 0rdR-0PrdK")
.有人想用
unpack "H*"
但不小心用了pack "H*"
.你应该解决这个问题,而不是试图解决这个问题。
可以使用以下方法获得所需的字节:
下面将提供一个可以传递到的字符串
hexToBytes
要获得相同的结果:c9x0cxw02#
pack("H*", '0rdR-0PrdK')
产生垃圾。没错,但在加密算法中,这些垃圾被用作密钥。当你使用相同的垃圾时,解密是可能的。
我真的时间紧迫,所以我这样做:
我在perl中找到了每个字符的压缩(h*…)值
用base64编码
在java中解码硬编码值
不是很优雅,但很管用