Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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中解压缩字节数组_Java_C#_Arrays - Fatal编程技术网

在Java中解压缩字节数组

在Java中解压缩字节数组,java,c#,arrays,Java,C#,Arrays,我的问题是关于C#和Java的 我想从这个链接中解压缩一个字节数组,类似于C#decompress的方法: 我用Java翻译了这个方法: public static byte[] Decompress(byte[] data) { try { Byte[] r = null; try (InputStream ms = new ByteArrayInputStream(data); InflaterInputStream s = new

我的问题是关于C#和Java的

我想从这个链接中解压缩一个字节数组,类似于C#decompress的方法:

我用Java翻译了这个方法:

public static byte[] Decompress(byte[] data)
{
    try {
        Byte[] r = null;

        try (InputStream ms = new ByteArrayInputStream(data);
        InflaterInputStream s = new InflaterInputStream(ms)
        ) {
            List<Byte> list = new ArrayList<Byte>();
            int count = 0;
            byte[] b = new byte[8192];

            while ((count = s.read(b, 0, 8192)) > 0) {
                for (byte by : Arrays.copyOfRange(b,0,count+1)) {
                    list.add(by);
                }
            }

            r = list.toArray(r);
            list.clear();
            list = null;
        }
        byte[] bytes = new byte[r.length];
        int j=0;
        // Unboxing Byte values. (Byte[] to byte[])
        for(Byte b: r)
            bytes[j++] = b.byteValue();
        return bytes;
    }
    catch (Exception e){
        System.out.println(e.toString());
    }

    return new byte[] {};
}
在爪哇

public static void main(String[] args)
    {
        String encodedString = "arlnk://F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO";
        encodedString = encodedString.substring(8);
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] decodedByteArray = decoder.decode(encodedString);
        decodedByteArray = d67(decodedByteArray, 28435);
        decodedByteArray = Zip.Decompress(decodedByteArray);
        System.out.print(hexlify(decodedByteArray));
    }

    private static byte[] d67(byte[] data, int b) {
        byte[] buffer = new byte[data.length];
        System.arraycopy(data, 0, buffer, 0, data.length);

        for (int i = 0; i < data.length; i++) {
            int unsignedData = unsignedToBytes(data[i]);

            buffer[i] = (byte) (unsignedData ^ b >> 8 & 255);

            b = (b + unsignedData) * 23219 + 36126 & 65535;
        }
        return buffer;
    }

    public static int unsignedToBytes(byte b) {
        return b & 0xFF;
    }

    public static String hexlify(byte[] data) {
        StringBuilder b = new StringBuilder();
        for (int i = 0; i < data.length; i++) {
            b.append(String.format("%02X", data[i]));
            if (i < data.length - 1) {
                b.append("-");
            }
        }
        return b.toString();
    }
publicstaticvoidmain(字符串[]args)
{
字符串编码字符串=”arlnk://F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO”;
encodedString=encodedString.substring(8);
Base64.Decoder Decoder=Base64.getDecoder();
字节[]decodedByteArray=解码器.decode(encodedString);
decodedByteArray=d67(decodedByteArray,28435);
decodedByteArray=Zip.解压缩(decodedByteArray);
系统输出打印(hexlify(decodedByteArray));
}
专用静态字节[]d67(字节[]数据,int b){
byte[]buffer=新字节[data.length];
数组复制(数据,0,缓冲区,0,数据长度);
对于(int i=0;i>8&255);
b=(b+无符号数据)*23219+36126和65535;
}
返回缓冲区;
}
公共静态整型无符号字节(字节b){
返回b&0xFF;
}
公共静态字符串十六进制(字节[]数据){
StringBuilder b=新的StringBuilder();
对于(int i=0;i
我有个例外

java.lang.NullPointerException:尝试获取空数组的长度

但是没有像C#那样的输出


我翻译错了什么?我也不明白为什么会出现这种例外:(…

您的解压缩方法乱七八糟,根本不起作用。它试图做的只是返回充气器流的完整输出。Java有一个内置的方法来执行此操作,可以替换整个过程。当您这样做时,您会得到完全相同的输出。下面是完整的程序,可以编译和运行:

import java.util.Base64;
import java.util.zip.InflaterInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

class Example {
    public static void main(String[] args) throws Exception {
        String encodedString = "arlnk://F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO";
        encodedString = encodedString.substring(8);
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] decodedByteArray = decoder.decode(encodedString);
        decodedByteArray = d67(decodedByteArray, 28435);
        decodedByteArray = decompress(decodedByteArray);
        System.out.print(hexlify(decodedByteArray));
    }

    private static byte[] d67(byte[] data, int b) {
        byte[] buffer = new byte[data.length];
        System.arraycopy(data, 0, buffer, 0, data.length);

        for (int i = 0; i < data.length; i++) {
            int unsignedData = unsignedToBytes(data[i]);
            buffer[i] = (byte) (unsignedData ^ b >> 8 & 255);
            b = (b + unsignedData) * 23219 + 36126 & 65535;
        }
        return buffer;
    }

    public static int unsignedToBytes(byte b) {
        return b & 0xFF;
    }

    public static String hexlify(byte[] data) {
        StringBuilder b = new StringBuilder();
        for (int i = 0; i < data.length; i++) {
            b.append(String.format("%02X", data[i]));
            if (i < data.length - 1) {
                b.append("-");
            }
        }
        return b.toString();
    }

    public static byte[] decompress(byte[] data) throws IOException {
        try (InputStream ms = new ByteArrayInputStream(data);
        InflaterInputStream s = new InflaterInputStream(ms)) {
            return s.readAllBytes();
        }
    }
}
import java.util.Base64;
导入java.util.zip.InflateInputStream;
导入java.io.ByteArrayInputStream;
导入java.io.IOException;
导入java.io.InputStream;
课例{
公共静态void main(字符串[]args)引发异常{
字符串编码字符串=”arlnk://F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO”;
encodedString=encodedString.substring(8);
Base64.Decoder Decoder=Base64.getDecoder();
字节[]decodedByteArray=解码器.decode(encodedString);
decodedByteArray=d67(decodedByteArray,28435);
decodedByteArray=解压缩(decodedByteArray);
系统输出打印(hexlify(decodedByteArray));
}
专用静态字节[]d67(字节[]数据,int b){
byte[]buffer=新字节[data.length];
数组复制(数据,0,缓冲区,0,数据长度);
对于(int i=0;i>8&255);
b=(b+无符号数据)*23219+36126和65535;
}
返回缓冲区;
}
公共静态整型无符号字节(字节b){
返回b&0xFF;
}
公共静态字符串十六进制(字节[]数据){
StringBuilder b=新的StringBuilder();
对于(int i=0;i

除了decompress方法,我没有做任何更改,现在几乎不包含任何代码。

我假设这是一行:
r=list.toArray(r);
Java文档状态:在Java中不使用相同的字符串。您好rzwitserloot,非常感谢您的帮助。调用readAllBytes()是否需要高于7的Java版本方法?我只有Java 7可用。编译器向我抛出错误:"“java.util.zip.InflaterInputStream”的未知方法“readAllBytes”。我想尝试调用具有java 7的方法。也许我可以……是的。java 7不再受支持,可能存在安全漏洞;升级它。我使用AIDE,因此我无法升级java。但如果我查看InflaterInputStream类,我找不到readAllB方法ytes()…我不知道AIDE是什么,但Java7不受支持-如果JRE或JDK存在安全问题,没有人会更新它。你必须离开它;如果AIDE强制执行它,那么也是时候停止使用它了。你可以搜索readAllBytes()的功能。这有点复杂,而且涉及循环。还有番石榴(一个库),它仍然运行在java7上,并且有一个方法:ByteStreams.toByteArray(input),您可以使用它:Hello rzwitserloot,我想我不能为Java控制台项目导入外部库。如果不使用库,就无法翻译我展示的C代码吗?我非常感谢您。。。
public static void main(String[] args)
    {
        String encodedString = "arlnk://F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO";
        encodedString = encodedString.substring(8);
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] decodedByteArray = decoder.decode(encodedString);
        decodedByteArray = d67(decodedByteArray, 28435);
        decodedByteArray = Zip.Decompress(decodedByteArray);
        System.out.print(hexlify(decodedByteArray));
    }

    private static byte[] d67(byte[] data, int b) {
        byte[] buffer = new byte[data.length];
        System.arraycopy(data, 0, buffer, 0, data.length);

        for (int i = 0; i < data.length; i++) {
            int unsignedData = unsignedToBytes(data[i]);

            buffer[i] = (byte) (unsignedData ^ b >> 8 & 255);

            b = (b + unsignedData) * 23219 + 36126 & 65535;
        }
        return buffer;
    }

    public static int unsignedToBytes(byte b) {
        return b & 0xFF;
    }

    public static String hexlify(byte[] data) {
        StringBuilder b = new StringBuilder();
        for (int i = 0; i < data.length; i++) {
            b.append(String.format("%02X", data[i]));
            if (i < data.length - 1) {
                b.append("-");
            }
        }
        return b.toString();
    }
import java.util.Base64;
import java.util.zip.InflaterInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

class Example {
    public static void main(String[] args) throws Exception {
        String encodedString = "arlnk://F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO";
        encodedString = encodedString.substring(8);
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] decodedByteArray = decoder.decode(encodedString);
        decodedByteArray = d67(decodedByteArray, 28435);
        decodedByteArray = decompress(decodedByteArray);
        System.out.print(hexlify(decodedByteArray));
    }

    private static byte[] d67(byte[] data, int b) {
        byte[] buffer = new byte[data.length];
        System.arraycopy(data, 0, buffer, 0, data.length);

        for (int i = 0; i < data.length; i++) {
            int unsignedData = unsignedToBytes(data[i]);
            buffer[i] = (byte) (unsignedData ^ b >> 8 & 255);
            b = (b + unsignedData) * 23219 + 36126 & 65535;
        }
        return buffer;
    }

    public static int unsignedToBytes(byte b) {
        return b & 0xFF;
    }

    public static String hexlify(byte[] data) {
        StringBuilder b = new StringBuilder();
        for (int i = 0; i < data.length; i++) {
            b.append(String.format("%02X", data[i]));
            if (i < data.length - 1) {
                b.append("-");
            }
        }
        return b.toString();
    }

    public static byte[] decompress(byte[] data) throws IOException {
        try (InputStream ms = new ByteArrayInputStream(data);
        InflaterInputStream s = new InflaterInputStream(ms)) {
            return s.readAllBytes();
        }
    }
}