Mam ciąg binarny i chcę podzielić go na fragmenty o długości 8, a następnie przechowywać odpowiednie bajty w tablicy bajtów. Na przykład ciąg „0000000011111111” powinien być konwertowany na {-128, 127}. Do tej pory napisałem następującą funkcję:

public static byte[] splitBinary(String binaryString) throws ConversionException {

    if (binaryString.length()%8 != 0) {
        throw new ConversionException();
    }

    byte[] result = new byte[binaryString.length()/8];

    while (i < result.length) {
        result[i] = (byte) (Integer.parseInt(binaryString.substring(i, i+8), 2)-128);
        i+=8;
    }
    return result;
} 

Ale to skutkuje {-128, 0}. Jak mogę osiągnąć pożądaną funkcjonalność?

0
maria93 16 grudzień 2019, 11:26
OP napisał powinien być konwertowany na {-128, 127}
 – 
Scary Wombat
16 grudzień 2019, 11:28
I+=8 w pętli for
 – 
Vihar
16 grudzień 2019, 11:29
Tak: dane wejściowe to ciąg „0000000011111111”, a dane wyjściowe to tablica bajtów {-128, 127}.
 – 
maria93
16 grudzień 2019, 11:29
Nie! Spowodowałoby to dostęp do result[8], który jest nieprawidłowy.
 – 
Seelenvirtuose
16 grudzień 2019, 11:31
Do wyniku można użyć innego indeksu, ale zgodnie z pytaniem jest to indeks następna iteracja powinna przyjąć iterację 1:0 do 7 iterację 2:8 do 15 i tak dalej
 – 
Vihar
16 grudzień 2019, 11:33

3 odpowiedzi

Twoja rutyna rozdzielania jest zła.

Zwiększenie i o 1 po prostu przesuwa okno o jeden znak w prawo, a nie o dwa, co powoduje, że odczytane są ciągi znaków 00000000 i 00000001.

0
Nicktar 16 grudzień 2019, 11:29
Dziękuję Ci! Zmieniłem to w pytaniu. Ale teraz prowadzi to do {-128,0}.
 – 
maria93
16 grudzień 2019, 11:35
Zmieniasz swoje pytanie i odrzucasz odpowiedź, że nie pasuje już do zmienionego pytania?
 – 
Nicktar
16 grudzień 2019, 11:38
Nikogo nie przegłosowałem! Chciałem tylko skorzystać z twojego pomocnego komentarza...
 – 
maria93
16 grudzień 2019, 11:41

Zmieniłem funkcję w następujący sposób i teraz działa zgodnie z oczekiwaniami (po poprawieniu moich oczekiwań;)). Dziękuję wam wszystkim!

public static byte[] splitBinaryStringToByteArray(String binaryString) throws ConversionException {

    if (binaryString.length()%8 != 0) {
        throw new ConversionException();
    }

    byte[] result = new byte[binaryString.length()/8];

    int i =0;int j=0;
    while (i < binaryString.length()) {
        System.out.println("Substring: " + binaryString.substring(i, i+8));
        result[j] =((byte)Integer.parseInt((binaryString.substring(i, i+8)), 2));
        j++;
        i+=8;
    }
    return result;
}
0
maria93 16 grudzień 2019, 12:11

Odnoszę się do rozmiaru wyniku, może być mniejszy niż rozmiar binaryString, ale w binaryString.substring(i, i+8) i i+=8; używasz jako rozmiaru binaryString. Więc zmień je na binaryString.substring(i*8, i*8+8) i i++.

0
milanbalazs 16 grudzień 2019, 12:36