Распаковать байтовый массив в Java - PullRequest
0 голосов
/ 18 июня 2020

Мой вопрос касается C# и Java.

Я хочу распаковать байтовый массив, как метод Decompress of C# по этой ссылке: https://github.com/AresChat/cb0t/blob/master/cb0t/Misc/Zip.cs

Я перевел метод в 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[] {};
}

В C#

public static void Main() 
        {
           string str = "F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO";
      byte[] val2 = Convert.FromBase64String(str);
      val2 = d67(val2, 28435);
      val2 = Zip.Decompress(val2);
      Console.WriteLine("Converted byte value: {0}", BitConverter.ToString(val2));
        }
private static byte[] d67(byte[] data, int b)
        {
            byte[] buffer = new byte[data.Length];
            Array.Copy(data, buffer, data.Length);

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

Получаю вывод:

00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-43-48-41-54-43-48-41-4E-4E-45-4C-00-36-26-D2-37-31-D4-00-00-00-00-4D-41-59-4F-52-45-53-20-44-45-20-33-30-2C-34-30-2C-35-30-00-00

И в Java

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

я получаю исключение

java .lang.NullPointerException: попытка получить длину нулевого массива

но нет вывода, как из C#.

Что я неправильно перевел? Я также не могу понять, почему я получаю это исключение: (...

1 Ответ

1 голос
/ 18 июня 2020

Ваш метод декомпрессии не работает и не работает. Все, что он пытается сделать, это вернуть полный вывод потока надувного устройства. 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();
        }
    }
}

Я действительно ничего не менял, кроме метода распаковки, который теперь почти не содержит кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...