Ver Mensaje Individual
  #3 (permalink)  
Antiguo 10/04/2007, 17:44
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: como covertir una cadena de texto a su equivalencia a binario con JavaScript

La función que posteas, MaBoRaK:
Código PHP:
function Dec2Hex(Decimal) {
    var 
hexChars "0123456789ABCDEF";
    var 
Decimal 16;
    var 
= (Decimal a)/16;
    
hex "" hexChars.charAt(b) + hexChars.charAt(a);
    return 
hex;

Equivale a
Código PHP:
Decimal.toString(16); 
El toString actúa sobre un número y directamente te lo devuelve en tipo String y pasado a la base que indiques por argumento.


De la misma manera, toString(2) te lo pasará a binario. Sólo tienes que sacar el numerito de cada caracter y hacerle un toString(2):
Código PHP:
String.prototype.toBase=function(base) {
    for(var 
i=0dev=""i<this.lengthi++)
        
dev+= this.charCodeAt(i).toString(base);
    return 
dev;

Esta función te servirá para pasar cualquier cadena a su equivalente matemático en cualquier base (entre 2 y 36 incluídos los dos).


Y como me aburría un poco he decidido crear la función inversa, la que pasa de la cadena que creamos anteriormente a la cadena original:
Código PHP:
String.prototype.toChar=function(fromBase) {
    
//iremos cogiendo cada número, convirtiéndolo a base decimal y hallando la letra que corresponde ese número
    //no sabemos qué delimita un número en ninguna base si están escritos sin espacios, pero sabemos que en base 10 el número ha de estar entre 65(A) y 122(z) (incluiremos algunos símbolos pero a efectos nos da igual)
    
var dev="";    //guardaremos aquí las letras a devolver
    
var posIni=0posFin=1;        //posIni y posFin delimitarán el número en this
    //iremos aumentando posFin hasta que el número, convertido a base 10, esté entre 65 y 122
    
while(posFin<=this.length) {        //iremos extrayendo numeros mientas posFin no llegue al final de this
        
var convertido=this.substring(posIni,posFin);                //convertido: parte de this a estudiar
        
convertidoparseIntconvertidofromBase );                //la pasamos a base 10
        
while( Number(convertido)<65 || Number(convertido)>122 ) {        //mientras no sea una letra
            
posFin++;                                                        //aumentamos posFin
            
convertidothis.substring(posIni,posFin);                        //rehacemos convertido para volver a estudiarlo
            
convertidoparseIntconvertidofromBase );
        }
        
//en este punto convertido es un número en base 10 que representa una letra
        //convertiremos ese número a su respectivo caracter, y lo añadiremos a la cadena a devolver
        
dev+=String.fromCharCode(convertido);
        
//posIni pasará a ser posFin, y posFin será posFin+1 para buscar más números en la cadena this
        
posIni=posFinposFin++;
    }
    
//en este punto dev contendrá todos los caracteres a devolver
    
return dev;

Está muy comentado para que se entienda todo bien. De todas maneras si no se ve algo, postead. Me he apoyado en parseInt(numero,baseOriginal) para pasar un numero en base baseOriginal a base decimal.



Con estas dos funciones haremos:
Código PHP:
var cadena="derkeNuke";
var 
base=16;
var 
laConvertida=cadena.toBase(base);
var 
laOriginal=laConvertida.toChar(base);
document.write"La cadena <b>"+cadena+"</b> convertida a base "+base+" da como resultado <b>"+laConvertida+"</b>, que si la volvemos a pasar a original obtendremos <b>"+laOriginal+"</b>."); 
Obteniendo como resultado:
Código:
La cadena derkeNuke convertida a base 16 da como resultado 6465726b654e756b65, que si la volvemos a pasar a original obtendremos derkeNuke.

Espero que os guste el script


Saludos a los dos!
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.