[Java] Реализация base64

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Byte_, 16 Mar 2010.

  1. Byte_

    Byte_ Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    143
    Likes Received:
    34
    Reputations:
    2
    Пытаюсь реализовать base64 "на коленке". Просто для практики (про существование готового решения я знаю).
    Шифрование:
    Code:
    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() + ". Программа готова.");
                    }
                }
    
    Расшифровка:
    Code:
    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 дня разбираюсь, не могу понять в чём проблема.
    Если кто разбирается в алгоритмизации, буду благодарен. Просто заклинило =)
     
  2. Red_EYEs

    Red_EYEs Member

    Joined:
    7 Aug 2009
    Messages:
    32
    Likes Received:
    12
    Reputations:
    11
    Ты в курсе что в java byte со знаком?
     
  3. Byte_

    Byte_ Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    143
    Likes Received:
    34
    Reputations:
    2
    Конечно. Это разве имеет принципиальное значение? в этом алгоритме работа идёт с битами числа. знак это 1 или 0 в знаковом бите числа. или я не прав?
     
Loading...
Similar Threads - Java Реализация base64
  1. b3
    Replies:
    4
    Views:
    3,671