Мой вопрос касается 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#.
Что я неправильно перевел? Я также не могу понять, почему я получаю это исключение: (...