Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [Java] Реализация base64 (https://forum.antichat.xyz/showthread.php?t=187411)

Byte_ 16.03.2010 13:05

[Java] Реализация base64
 
Пытаюсь реализовать base64 "на коленке". Просто для практики (про существование готового решения я знаю).
Шифрование:
Код:

public void actionPerformed(ActionEvent e)
            {
                status.setText("Идёт обработка...");
                try
                {
                    int size;
                    InputStream is = new FileInputStream(inpFile.getText());
                    size = is.available();
                    int ost = size%3;
                    if(ost == 1)
                    {
                        size += 2;
                    }else if(ost == 2)
                    {
                        size += 1;
                    }
                    int bnSize = (size/3)*4;
                    byte[] b = new byte[size];
                    byte[] bn = new byte[bnSize];
                    is.read(b);
                    is.close();
                    int j = 0;
                    for(int i = 0;i<size;i+=3)
                    {
                        bn[j] = (byte) ((b[i] & 0xfc) >> 2);
                        bn[j+1] = (byte) (((b[i] & 0x03) << 4) + ((b[i+1] & 0xf0) >> 4));
                        bn[j+2] = (byte) (((b[i+1] & 0x0f) << 2) + ((b[i+2] & 0xc0) >> 6));
                        bn[j+3] = (byte) (b[i+2] & 0x3f);
                        j+=4;
                    }
                    String res = new String("");
                    for(int i = 0;i < bnSize;i++)
                    {
                        res += b64_k.charAt(bn[i]);
                    }
                    if(ost == 1)
                    {
                        res = res.substring(0,res.length() - 2) + "==";
                    }else if(ost == 2)
                    {
                        res = res.substring(0,res.length() - 1) + "=";
                    }
                    OutputStream os = new FileOutputStream(outFile.getText());
                    os.write(res.getBytes());
                    os.close();
                    status.setText("Обработка завершена. Программа готова.");
                }catch(Exception ex)
                {
                    status.setText("Обработка завершена с ошибкой " + ex.getMessage() + ". Программа готова.");
                }
            }

Расшифровка:
Код:

public void actionPerformed(ActionEvent e)
            {
                status.setText("Идёт обработка...");
                try
                {
                    int size;
                    InputStream is = new FileInputStream(inpFile.getText());
                    size = is.available();
                    byte[] b = new byte[size];
                    is.read(b);
                    is.close();
                    int bnSize = (size/4)*3;
                    byte[] bn = new byte[bnSize];
                    int j = 0;
                    for(int i = 0;i < size;i+=4)
                    {
                        bn[j] = (byte) ((b[i] << 2) + ((b[i+1] & 0x03) >> 4));
                        bn[j+1] = (byte) (((b[i+1] & 0xf) << 4) + ((b[i+2] & 0x3c) >> 2));
                        bn[j+2] = (byte) (((b[i+2] & 0x3) << 6) + b[i+3]);
                        j+=3;
                    }
                    System.out.println(new String(bn));
                    status.setText("Обработка завершена. Программа готова.");
                }catch(Exception ex)
                {
                    status.setText("Обработка завершена с ошибкой " + ex.getMessage() + ". Программа готова.");
                }
            }

Проблема в том, что зашифровывает отлично, а расшифровывает не корректно (возвращает муть). 2 дня разбираюсь, не могу понять в чём проблема.
Если кто разбирается в алгоритмизации, буду благодарен. Просто заклинило =)

Red_EYEs 18.03.2010 15:38

Ты в курсе что в java byte со знаком?

Byte_ 18.03.2010 18:22

Цитата:

Сообщение от Red_EYEs
Ты в курсе что в java byte со знаком?

Конечно. Это разве имеет принципиальное значение? в этом алгоритме работа идёт с битами числа. знак это 1 или 0 в знаковом бите числа. или я не прав?


Время: 12:47