Видео стеганография в java

Я реализую стеганографию видео для своего проекта. Я наткнулся на алгоритм на странице здесь . Я попробовал и протестировал код, и часть встраивания работает нормально. Но я столкнулся с проблемой с readByte, который является последним методом в классе VideoSteganography. Метод дает ArrayIndexOutOfBoundsException . Ниже приведен метод.

Я передаю параметры как

    String fname = jTextField3.getText();
    File fil = new File(fname);
    String password = "123456";

    SteganoInformation cls = new SteganoInformation(fil);

    VideoSteganography.retrieveFile(cls, password, true);

и метод

public static boolean retrieveFile(SteganoInformation info, String password, boolean overwrite)
    {
        File dataFile= null;
        features= info.getFeatures();
        try
        {
            masterFile= info.getFile();
            byteArrayIn= new byte[(int) masterFile.length()];

            DataInputStream in= new DataInputStream(new FileInputStream(masterFile));
            in.read(byteArrayIn, 0, (int)masterFile.length());
            in.close();  
            messageSize= info.getDataLength();
            byte[] fileArray= new byte[messageSize];
            inputOutputMarker= info.getInputMarker();
            readBytes(fileArray);
.......
}

Обратите внимание на метод readBytes выше, он выдает исключение и записывается, как показано ниже.

private static void readBytes(byte[] bytes)
    {
        int size= bytes.length;

        for(int i=0; i<size ; i++)
        {


            bytes[i]= byteArrayIn[inputOutputMarker];
            inputOutputMarker++;



        }
    }

person Nuru Salihu    schedule 11.04.2013    source источник


Ответы (2)


Проблема здесь заключается в том, что «byteArrayIn[inputOutputMarker]». Перепроверьте значение inputOutputMarker и диапазон значений, которые он может иметь.

person Mazen Wadi    schedule 15.04.2013

@Мазен Вади, спасибо за ответ. Но я понял, что вызвало само исключение, и хотел бы поделиться, если кто-то столкнется с той же проблемой. Из двух классов «класс VideoSteganography» и «класс SteganoInformation» есть два цикла из методов retrieveBytes() из обоих классов. Измените петли на приведенные ниже и убедитесь, что размер петли совпадает в обоих классах. Примечание: измените j=6 в методе retrieveBytes двух классов, и ваша проблема будет решена.

private static void retrieveBytes(byte[] bytes)
        {
            int size= bytes.length;

            for(int i=0; i< size; i++)
            {
                byte1= 0;
                for(int j=6; j>=0; j-=2)
                {
                    byte2= byteArrayIn[inputOutputMarker];
                    inputOutputMarker++;

                    byte2&= 0x03;
                    byte2<<= j;
                    byte1|= byte2;
                }
                bytes[i]= byte1;
            }
        }
person Nuru Salihu    schedule 17.04.2013