Ayuda con un codificador y decodificador de bajo nivel

Saludos a toda la comunidad

El motivo de este mensaje es para pedir de su ayuda, ya sea que me iluminen un poco de que funciones puedo usar o que me ayuden con codigo, para realizar un codificador y su decodificador de bajo nivel el cual necesito que hagan lo siguiente:

* El codificador debe recibir una cadena (una sola palabra).
* Esa cadena se debe de convertir en su equivalente binario.
* El binario resultante debe repetir 2 veces cada valor del numero binario
Ejemplo:
El binario: 1 0 1 0 se debe convertir en: 1 1 1 0 0 0 1 1 1 0 0 0
* Despues de esa parte se deben de tomar los primeros 8 bits y convertirlo a su equivalente alfanumerico y del ultimo numero volver a contar 8 y se repite el paso.

Y para el decodificador pues seria que realice lo contrario al codificador, pasar la palabra codificada a una palabra decodificada osease entendible

En cuanto a codigo pues no tengo mucho la verdad por que topo con pared algo rapido.

Sin mas espero me puedan ayudar y de antemano gracias

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Sr. Negativo

¿Criptografía u operaciones sobre bits?

No entendí muy bien, ¿quieres hacer operaciones sobre bits, o encriptar/desencriptar una cadena? ¿o ambas cosas?

Una ayuda:

  1. Antes de hacer preguntas
  2. http://casidiablo.net/char-to-binario/
  3. http://www.javamexico.org/foros/java_standard_edition/ignorancia_de_operaciones_sobre_bits
  4. Criptografía en Java

Ejemplo.java

import java.io.BufferedReader;
import java.io.InputStreamReader;

class Ejemplo{
        public static final int MAX=3;
        public static void main(String[] args) {
                Entrada entrada= new Entrada();
                String dato="";
                byte[] b=new byte[MAX];
                System.out.println("Introduce una cadena: ");
                dato=entrada.cadena();

                b=dato.getBytes();

                System.out.println("resultado en bits: "+b);
        }
}

class Entrada{

   static String inicializar(){
   String entrada="";
   BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in));
   try{
   entrada=teclado.readLine();
   }catch(Exception e){
   System.err.println("error: "+e+"  causa:"+e.getCause());
   }
   return entrada;
   }

   static int entero(){
   int entero=Integer.parseInt(inicializar());
   return entero;
   }

   static double real(){
   double real=Double.parseDouble(inicializar());
   return real;
   }

   static String cadena(){
   String cadena=inicializar();
   return cadena;
   }
   static char caracter(){
   String caracter=inicializar();
   char caracterPrimero;
   caracterPrimero = (char)caracter.charAt(0);
   return caracterPrimero;

   }

}

Pues serian las dos ya que

Pues serian las dos ya que necesito encriptar y desencriptar una cadena (palabra) para encriptar necesito manejar los btis (unos y ceros de cada caraceter) para duplicar cada una para obtener una cadena mas grande en bits y de ahi cada 8 bits pasarlo a su equivalente en ascii o alfanumerico

Imagen de ezamudio

codificar

no es encriptar ya que no hay llave; es simple codificación.

@check_51 dijo inicialmente

@check_51 dijo inicialmente codificar.

Pues de hecho ya tienes el algoritmo hecho, solo es cosa de que lo vayas aterrizando en pseudo-codigo y luego en código.

Hay que buscar algunas funciones pero debería de estar rápido.

Ahi te va una versión con pseudo-codigo.

//* El codificador debe recibir una cadena (una sola palabra).
codifica( cadena String )  String {
    //* Esa cadena se debe de convertir en su equivalente binario.
    equivalenteEnBytes = convertirEnArregloDeBytes( cadena )

    //* Despues de esa parte se deben de tomar los primeros 8 bits y convertirlo a su
    // equivalente alfanumerico y del ultimo numero volver a contar 8 y se repite el paso.
    resultado = convertirEnString( equivalenteEnBytes )
}

//* El binario resultante debe repetir 2 veces cada valor del numero binario
convertirEnArregloDeBytes( cadena String ) Byte[] {
    resultado = byte[]
    i  = 0
    forEach( byte en cadena ) {
        //El binario: 1 0 1 0 se debe convertir en: 1 1 1 0 0 0 1 1 1 0 0 0
        unint = triplica(byte)
        resultado[i++] = (byte) unInt << 8; // creo que esto cambia los bits 8 veces y al castearlo tomamos solo el inicio
        resultado[i++] = (byte) unInt << 8;
        resultado[i++] = (byte) unInt << 8;
    }
    resultado
}

convertirEnString( arreglo Byte[] ) String  {
    String( arreglo , Encoding.ASCII ) // o algo así :)
}

triplica( unByte Byte ) Int {
    asString = String.toBinaryString( unByte )
    stringBuilder = StringBuilder()
    forEach( char en asString ) {
        stringBuilder.append( char ).append(char).append(char)
    }
    return Integer.parseInt( stringBuilder.toString, base: 2 )
}

Esa es la idea general. El punto aquí es ir separando los pasos que ya tienes, en funciones más chiquitas que después puedas escribir en Java una a la vez. Si aún no sabes como resolver una de ellas regresas un valor fijo, ejemplo:

public int  triplica( byte unByte ) {
    return 0b111_000_111_000;
}

El punto es desatorarte. Inténtalo así, revisa este pseudo-codigo, haz el tuyo propio, busca las funciones que necesites en internet , prepara un programa o algunas funciones y repite.

Espero que esto te sea útil.