Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中具有非十六进制字符的等效Perl包(“H*”)_Java_Perl_Hex_Byte_Pack - Fatal编程技术网

Java中具有非十六进制字符的等效Perl包(“H*”)

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

我正在尝试将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;
}
你们有谁有这样的问题吗?如何解决它?

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;
    }