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
- Inicie sesión o regístrese para enviar comentarios
¿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:
Ejemplo.java
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
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.
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:
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.