Java中具有非十六进制字符的等效Perl包(“H*”)
我正在尝试将Perl脚本重写为Java。此脚本中有一行包含pack函数:Java中具有非十六进制字符的等效Perl包(“H*”),java,perl,hex,byte,pack,Java,Perl,Hex,Byte,Pack,我正在尝试将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
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;
}
你们有谁有这样的问题吗?如何解决它?pack(“H*”,'0rdR-0PrdK')
产生垃圾
$perl-M5.014-e'
my$encoded=pack“H*”,$ARGV[0];
my$decoded=解包“H*”,$encoded;
比如$decoded;
是否说$decoded eq$ARGV[0]?“确定”:“错误”;
'0rdR-0PrdK
0BD09BD4
错误
不可能从pack(“H*”,0rdR-0PrdK)的输出中获取0rdR-0PrdK
有人打算使用解包“H*”
,但意外使用了打包“H*”
#字节->十六进制
$perl-M5.014-e'say unpack“H*”,$ARGV[0]'0rdR-0PrdK
307264522d305072644b
#十六进制->字节
$perl-M5.014-e'say pack“H*”,$ARGV[0]'\
$(perl-M5.014-e'say unpack“H*”,$ARGV[0]'0rdR-0PrdK)
0rdR-0PrdK
你应该解决这个问题,而不是试图绕过这个bug
可以使用以下方法获得所需的字节:
$perl-M5.014-e'say用于解包“c*”,打包“H*”,$ARGV[0]'0rdR-0PrdK
11
-37
-48
-101
-44
以下内容将提供一个字符串,您可以将该字符串传递到hexToBytes
,以获得相同的结果:
$perl-M5.014-e'say表示解包“H*”,打包“H*”,$ARGV[0]'0rdR-0PrdK
0BD09BD4
pack(“H*,'0rdR-0PrdK')
产生垃圾
这是真的,但这个垃圾在加密算法中被用作密钥。当使用相同的垃圾时,可以解密
我的时间紧迫,所以我这样做:
- 我在Perl中找到了每个字符的压缩(H*…)值
- 用Base64编码它们
- 在Java中解码硬编码值
私有静态最终字符串[]可能字符串={0`'、“`0”、“0~”、“~0”、“0!”、“!0”、“0@”、“@0”、“0”、“#0”、“0$”、“$0”、“0%”、“%0”、“0^”和“^0”,
"0&", "&0", "0*", "*0", "0(", "(0", "0)", ")0", "0-", "-0", "0_", "_0", "0=", "=0", "0+", "+0", "0[", "[0", "0{", "{0",
“0]、“]0”、“0}”、“0}”、“0\\”、“\\0”、“0”、“\0”、“0”、“0”、“0:”、“:0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0a”、“a0”、“0b”、“b0”、“0c”、“c0”、“0d”、“d0”、“0e”、“e0”、“0f”,
“f0”、“0g”、“g0”、“0h”、“h0”、“0i”、“i0”、“0j”、“j0”、“0k”、“k0”、“0l”、“l0”、“0m”、“m0”、“0n”、“n0”、“0o”、“o0”、“0p”,
“p0”、“0q”、“q0”、“0r”、“r0”、“0s”、“s0”、“0t”、“t0”、“0u”、“u0”、“0v”、“v0”、“0w”、“w0”、“0x”、“x0”、“0y”、“y0”、“0z”,
“z0”、“00”、“00”、“01”、“10”、“02”、“20”、“03”、“30”、“04”、“40”、“05”、“50”、“06”、“60”、“07”、“70”、“08”、“80”、“09”、“90”};
私有静态最终字符串[]base64codes={“AA==”,“AA=”,“Dg=”,“4A=”,“AQ=”,“EA=”,“AA=”,“AA=”,“Aw=”,“MA=”,“BA=”,
“QA==”、“BQ=”、“UA=”、“Dg=”、“4A=”、“Bg=”、“YA=”、“Cg=”、“oA=”、“CA=”、“gA=”、“CQ=”、“kA=”、“DQ=”、“0A=”,
“Dw=”、“8A=”、“DQ=”、“0A=”、“Cw=”、“sA=”、“Cw=”、“sA=”、“Cw=”、“sA=”、“DQ=”、“0A=”、“DQ=”、“0A=”、“DA=”,
“wA==”、“DA=”、“wA=”、“Cw=”、“sA=”、“Cg=”、“oA=”、“Bw=”、“cA=”、“Ag=”、“IA=”、“DA=”、“wA=”、“DA=”、“wA=”、“wA=”,
“Dg==”、“4A=”、“Dg=”、“4A=”、“Dw=”、“8A=”、“Dw=”、“8A=”、“Cg=”、“oA=”、“Cw=”、“sA=”、“DA=”、“wA=”、“DQ=”,
“0A==”、“Dg=”、“4A=”、“Dw=”、“8A=”、“AA=”、“AA=”、“AQ=”、“EA=”、“Ag=”、“IA=”、“Aw=”、“MA=”、“BA=”、“QA=”,
“BQ==”、“UA=”、“Bg=”、“YA=”、“Bw=”、“cA=”、“cA=”、“gA=”、“CQ=”、“kA=”、“Cg=”、“oA=”、“Cw=”、“sA=”、“DA=”,
“wA==”、“DQ=”、“0A=”、“Dg=”、“4A=”、“Dw=”、“8A=”、“AA=”、“AA=”、“AQ=”、“EA=”、“Ag=”、“IA=”、“Aw=”、“MA=”,
“AA=”、“AA=”、“AQ=”、“EA=”、“Ag=”、“IA=”、“Aw=”、“MA=”、“BA=”、“QA=”、“BQ=”、“UA=”、“Bg=”、“YA=”、“Bw=”,
“cA==”、“cA=”、“gA=”、“CQ=”、“kA=”};
私有静态void初始化hashmap(){
for(int i=0;i
虽然不优雅,但它可以工作您可以自己看到,Java返回-1表示无效的十六进制数字,而perl返回的模-16值为{digit-'0'}(例如'F'=15,'g'=0,'H'=1,'I'=2…)因此,使用这些知识,您可以自己解决这个问题。然而,很有趣的是,为什么您首先要在无效输入上使用perl的pack函数。
-1 11
-49 -37
-16 -48
-17 -101
-49 -44
private static final String[] possibleChars = {"0`", "`0", "0~", "~0", "0!", "!0", "0@", "@0", "0#", "#0", "0$", "$0", "0%", "%0", "0^", "^0",
"0&", "&0", "0*", "*0", "0(", "(0", "0)", ")0", "0-", "-0", "0_", "_0", "0=", "=0", "0+", "+0", "0[", "[0", "0{", "{0",
"0]", "]0", "0}", "}0", "0\\", "\\0", "0|", "|0", "0;", ";0", "0:", ":0", "0'", "'0", "0\"", "\"0", "0,", ",0", "0<",
"<0", "0.", ".0", "0>", ">0", "0/", "/0", "0?", "?0", "0a", "a0", "0b", "b0", "0c", "c0", "0d", "d0", "0e", "e0", "0f",
"f0", "0g", "g0", "0h", "h0", "0i", "i0", "0j", "j0", "0k", "k0", "0l", "l0", "0m", "m0", "0n", "n0", "0o", "o0", "0p",
"p0", "0q", "q0", "0r", "r0", "0s", "s0", "0t", "t0", "0u", "u0", "0v", "v0", "0w", "w0", "0x", "x0", "0y", "y0", "0z",
"z0", "00", "00", "01", "10", "02", "20", "03", "30", "04", "40", "05", "50", "06", "60", "07", "70", "08", "80", "09", "90"};
private static final String[] base64codes = {"AA==", "AA==", "Dg==", "4A==", "AQ==", "EA==", "AA==", "AA==", "Aw==", "MA==", "BA==",
"QA==", "BQ==", "UA==", "Dg==", "4A==", "Bg==", "YA==", "Cg==", "oA==", "CA==", "gA==", "CQ==", "kA==", "DQ==", "0A==",
"Dw==", "8A==", "DQ==", "0A==", "Cw==", "sA==", "Cw==", "sA==", "Cw==", "sA==", "DQ==", "0A==", "DQ==", "0A==", "DA==",
"wA==", "DA==", "wA==", "Cw==", "sA==", "Cg==", "oA==", "Bw==", "cA==", "Ag==", "IA==", "DA==", "wA==", "DA==", "wA==",
"Dg==", "4A==", "Dg==", "4A==", "Dw==", "8A==", "Dw==", "8A==", "Cg==", "oA==", "Cw==", "sA==", "DA==", "wA==", "DQ==",
"0A==", "Dg==", "4A==", "Dw==", "8A==", "AA==", "AA==", "AQ==", "EA==", "Ag==", "IA==", "Aw==", "MA==", "BA==", "QA==",
"BQ==", "UA==", "Bg==", "YA==", "Bw==", "cA==", "CA==", "gA==", "CQ==", "kA==", "Cg==", "oA==", "Cw==", "sA==", "DA==",
"wA==", "DQ==", "0A==", "Dg==", "4A==", "Dw==", "8A==", "AA==", "AA==", "AQ==", "EA==", "Ag==", "IA==", "Aw==", "MA==",
"AA==", "AA==", "AQ==", "EA==", "Ag==", "IA==", "Aw==", "MA==", "BA==", "QA==", "BQ==", "UA==", "Bg==", "YA==", "Bw==",
"cA==", "CA==", "gA==", "CQ==", "kA=="};
private static void initializeHashMap() {
for (int i = 0; i < possibleChars.length; i++) {
hashMap.put(possibleChars[i], base64codes[i]);
}
}
public static byte[] h16pack(String s) {
String str = s.toLowerCase();
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) (Base64.decode(hashMap.get(str.charAt(i) + "0"))[0]
+ Base64.decode(hashMap.get("0" + str.charAt(i + 1)))[0]);
}
return data;
}