Crear binario a partir de string de unos y ceros

5erg10
23 de Marzo del 2003
Lo primero dar un saludo a tod@s.

Toy haciendo una practica en java sobre un programa ke traduce instrucciones de ensamblador del procesador DLX a binario. La cosa es ke ya he hecho toda la parte de codificar las instrucciones, pero ahora tengo un monton de unos y ceros metidos en un String y tengo ke guardarlos en un archivo binario.

Pos weno, ahi está el problema. Estoy usando la clase DataOutputStream para hacer el archivo, pero no encuentro la forma de guardar cada '1' o '0' de forma ke ocupen un bit en el archivo.

Si escribo cada digito con writeInt me ocupan 4 bytes, ke se supone ke es lo ke ocupa una instrucción entera en DLX... y tengo 32 digitos en cada una! (instrucciones de 128 bytes... no es plan, ¿no?)

Como vereis, toy más perdido ke un ioputarl el dia del padre, asi ke si alguien me puede decir la forma en ke puedo guardarlos para ke el archivo binario kede bien... pos le estaré muy agradecidor.

Un saludo.

OLORaNUBE
23 de Marzo del 2003
Hola compañero.
Lo suyo hubiera sido guardar las codificaciones de las instrucciones en enteros de 32 bits, en vez de utilizar Strings de 1`s y 0´s. Me imagino que cambiar eso en estos momentos no sea fácil, así que es mejor que intentes escribir el archivo bit a bit. Creo que con los métodos writeByte o writeBoolean de la clase DataOutputStream podrás hacerlo.
Espero haberte ayudado. Suerte.

5erg10
23 de Marzo del 2003
Pues te voy a hacer caso, y usaré writeByte, porke si me pongo a cambiar ahora lo otro, como bien dices, yo creo ke me cargo todo el programa xDD

Un saludo y gracias por la ayuda ;)

nkpevfqy
23 de Marzo del 2003
Bueno, yo tambien hice un traductor de instrucciones DLX a binario, hice un programita para simular una CPU con un juego de instrucciones parecido al DLX (MIPS R3000). Como no vas a cambiar lo que tienes, te propongo el siguiente bucle:

FileOutputStream out = new FileOutputStream (new File("binario.dlx"));
String binario[] // strings con la instrucciones con 32 '1' y '0'
for (int i = 0; i < binario.length(); i++) { //recorremos cada instruccion
int instrucion = 0x00000000;
for (int j = 0; j < 32; j++) //recorremos cada '0' y '1' del string
if (binario[i].charAt(j) == '1') //si es un '1'
instruccion |= 1 << (31 - j) //al int le ponemos un bit a 1 en la posicion j

out.write((instruccion & 0xff000000) >> 24); //escribimos el primer byte, mas alto, del int
out.write((instruccion & 0x00ff0000) >> 16); //escribimos el segundo byte del int
out.write((instruccion & 0x0000ff00) >> 8); //escribimos el tercer byte del int
out.write(instruccion & 0x000000ff ); //escribimos el cuarto byte del int
}

5erg10
23 de Marzo del 2003
Gracias tio, te debo una. Si alguna vez necesitas algo (ke no sea de java, porke ya ves como ando :D) ya sabes ande toy ;)