Как исправить IndexOutOfBoundsException, используя ByteArrayOutputStream в Java - PullRequest
0 голосов
/ 25 сентября 2019

Я занимаюсь домашним пивом RSA для выполнения задания.Все шло гладко, но когда я хочу преобразовать байтовые данные обратно в строку, я решил использовать ByteArrayOutputStream.Тем не менее, когда я пытаюсь записать в него, используя .write (byte [], offset, bytes], он выдает исключение IndexOutOfBoundsException.

Я немного поработал с ним, и это единственная конфигурация.вызов write (x, y, z,) работает (byte [], 0, 1). Когда я печатаю результат, он отображается как тильда (~). Любое большее значение вызывает то же исключение. Я проверил, чтобайтовый массив достаточно велик для записи в него, как путем распечатки его содержимого, так и создания нового байтового массива и размещения его в интервале. Кроме того, он все равно выдает ошибку, даже если я вручную назначил длину ByteArrayOutputStream равной 126 в вызове конструктора.Если я это сделаю, метод .size () по-прежнему возвращает 0. Заранее извиняюсь за жестокие имена переменных.

String whatever = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
        ByteArrayInputStream blickblack = new ByteArrayInputStream(whatever.getBytes());
        byte[] blech = new byte[126];
        BigInteger tester = new BigInteger(blech);
        String s = tester.toString();
        final BigInteger OFFSET = new BigInteger("10").pow(303);
        tester = tester.add(new BigInteger("126").multiply(OFFSET));
        s = tester.toString();
        Random rnd = new Random();
        BigInteger p = new BigInteger(511, 20, rnd);
        BigInteger q = new BigInteger(512, 20, rnd);
        BigInteger n = q.multiply(p);
        final BigInteger ONE = new BigInteger("1");
        BigInteger totient = (q.subtract(ONE)).multiply(p.subtract(ONE));
        BigInteger e = new BigInteger("65537");
        BigInteger d = RSACipher.ExtendedEuclidean(e, totient);
        BigInteger ciphertext = tester.modPow(e, n);
        BigInteger plaintext = ciphertext.modPow(d, n);
        BigInteger bits = plaintext.divide(OFFSET);
        byte[] output = new byte[Integer.parseInt(bits.toString())];
        System.out.println("Bits: " +Integer.parseInt(bits.toString()));
        output = bits.toByteArray();
        System.out.println(output);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(126);
        System.out.println(outputStream.size());
        outputStream.write(output, 0, 126);
        System.out.println(outputStream.toString(StandardCharsets.UTF_8));

Ожидаемый результат - все будет продолжаться до последнего оператора печати, чтодолжен быть 126 байтов неконтролируемого крика о победе. К сожалению, он зацепился за оператор outputStream.write (output, 0, 126).w печатать выписки и код ошибки.

Bits: 126
[B@8646db9
0


java.lang.IndexOutOfBoundsException: Range [0, 0 + 126) out of bounds for length 1

    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromIndexSize(Preconditions.java:82)
    at java.base/jdk.internal.util.Preconditions.checkFromIndexSize(Preconditions.java:343)
    at java.base/java.util.Objects.checkFromIndexSize(Objects.java:424)
    at java.base/java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:155)
    at cipher.RSACipherTest.getE(RSACipherTest.java:50)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:628)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:117)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:184)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:180)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:127)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
    at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)
    at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

Пожалуйста, помогите!

...