Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] De ASCII to bytes

Estas en el tema de De ASCII to bytes en el foro de Java en Foros del Web. Buenas, tengo este codigo que debería recibir un String de un carácter y retornar un String con los bytes del código, el problema es que ...
  #1 (permalink)  
Antiguo 29/01/2016, 18:59
 
Fecha de Ingreso: julio-2010
Mensajes: 31
Antigüedad: 13 años, 9 meses
Puntos: 0
Pregunta De ASCII to bytes

Buenas, tengo este codigo que debería recibir un String de un carácter y retornar un String con los bytes del código, el problema es que al enviar algunos String, en casi todos funciona correctamente y devuelve un String de 8 caracteres de 0 y 1, pero con algunos símbolos devuelve un String de 16 Caracteres de 0 y 1

Código:
public static String AsciiToBinary(String asciiString){  

          byte[] bytes = asciiString.getBytes();  
          StringBuilder binary = new StringBuilder();  
          for (byte b : bytes)  
          {  
             int val = b;  
             for (int i = 0; i < 8; i++)  
             {  
                binary.append((val & 128) == 0 ? 0 : 1);  
                val <<= 1;  
             }  
          }  
          return binary.toString();  
    }

Por ejemplo si le envio : ªØ(

me Devuelve :

Código:
1100001010101010
1100001110011000
00101000
Los 2 primeros términos son String de 16 caracteres
Ademas el código Correcto que debería devolver es:

Código:
10101010
10011000
00101000
Si Alguien sabe el problema o tiene un Codigo para transformar de ASCII to bytes, se lo agradecería mucho.

Atte.
  #2 (permalink)  
Antiguo 30/01/2016, 02:14
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: De ASCII to bytes

Buenas,

Pues no lo entiendo, porque a mi me funciona perfectamente. Este es mi test:

Código Java:
Ver original
  1. public class TestAscii {
  2.     public static void main(String[] args) {
  3.         System.out.println(AsciiToBinary("ª"));
  4.         System.out.println(AsciiToBinary("Ø"));
  5.         System.out.println(AsciiToBinary("("));
  6.     }
  7.    
  8.     public static String AsciiToBinary(String asciiString){  
  9.  
  10.           byte[] bytes = asciiString.getBytes();  
  11.           StringBuilder binary = new StringBuilder();  
  12.           for (byte b : bytes)  
  13.           {  
  14.              int val = b;  
  15.              for (int i = 0; i < 8; i++)  
  16.              {  
  17.                 binary.append((val & 128) == 0 ? 0 : 1);  
  18.                 val <<= 1;  
  19.              }  
  20.           }  
  21.           return binary.toString();  
  22.     }
  23. }

Resultado:
10101010
11011000
00101000

http://www.ascii-code.com/


No estaras enviando al metodo accidentalmente dos caracteres en lugar de uno?


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 30/01/2016, 15:32
 
Fecha de Ingreso: julio-2010
Mensajes: 31
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: De ASCII to bytes

Pues la verdad no se lo que pasa, segun yo lo estoy haciendo bien, no veo ningún error, no se si puede ser un error por el alfabeto que utilizo.

Código Java:
Ver original
  1. public class aaa {
  2.    
  3.     public static void main(String argv[]){
  4.         String nux2="Ø";
  5.         byte []bites = nux.getBytes();
  6.         byte []bites2 = nux2.getBytes();
  7.         byte []bites3 = nux3.getBytes();
  8.                System.out.println(AsciiToBinary("ª"));
  9.                System.out.println(AsciiToBinary(nux2));
  10.                System.out.println(AsciiToBinary("("));
  11.                System.out.println("La Cantidad de Bites que contiene es :"+bites.length);
  12.                System.out.println("La Cantidad de Bites que contiene es :"+bites2.length);
  13.                System.out.println("La Cantidad de Bites que contiene es :"+bites3.length);
  14.     }
  15.    
  16.     public static String AsciiToBinary(String asciiString){  
  17.  
  18.           byte[] bytes = asciiString.getBytes();  
  19.           StringBuilder binary = new StringBuilder();  
  20.           for (byte b : bytes)  
  21.           {  
  22.              int val = b;  
  23.              for (int i = 0; i < 8; i++)  
  24.              {  
  25.                 binary.append((val & 128) == 0 ? 0 : 1);  
  26.                 val <<= 1;  
  27.              }  
  28.           }  
  29.           return binary.toString();  
  30.     }
  31.    
  32. }

Aqui esta mi codigo compilado : https://ideone.com/3yrlVJ

Salida:
Código:
1100001010101010
1100001110011000
00101000
La Cantidad de Bites que contiene es :2
La Cantidad de Bites que contiene es :2
La Cantidad de Bites que contiene es :1

Última edición por PazMundial; 30/01/2016 a las 15:50
  #4 (permalink)  
Antiguo 30/01/2016, 19:15
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: De ASCII to bytes

El primer byte es todo ceros, por eso no lo tiene en cuenta.

No se cumple del todo, pero te pasará lo mismo casi con cualquier caracter de ASCII extendido.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #5 (permalink)  
Antiguo 31/01/2016, 11:50
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: De ASCII to bytes

Buenas,

En cualquier caso aunque se utilice el ASCII extendido, un byte puede almacenar 256 valores, por lo que no deberia haber problema.

El caso es que Java, aunque originalmente utilizaba Ascii (ver constructores deprecados de la clase String) desde hace ya muchisimo tiempo utiliza internamente el charset Unicode para representar los caracteres.

Por lo tanto, lo que te pasa es que si utilizas String no estas convirtiendo a codigos ASCII, sino a codigos del charset por defecto en tu sistema, UTF-8: http://www.utf8-chartable.de/
UTF-8 utiliza 1 byte solo para los primeros caracteres y para el resto utiliza 2. Eso explica los extranos resultados.

Para conseguir lo que quieres tendras que trabajar a mas bajo nivel y utilizar char en lugar de String.

Código Java:
Ver original
  1. public class TestASCII {
  2.     public static void main(String[] args) {
  3.         System.out.println(AsciiToBinary("ªØ(".charAt(0)));
  4.         System.out.println(AsciiToBinary("ªØ(".charAt(1)));
  5.         System.out.println(AsciiToBinary("ªØ(".charAt(2)));
  6.     }
  7.    
  8.     public static String AsciiToBinary(char character){  
  9.           StringBuilder binary = new StringBuilder();  
  10.  
  11.            int val = character;  
  12.              for (int i = 0; i < 8; i++)  
  13.              {  
  14.                 binary.append((val & 128) == 0 ? 0 : 1);  
  15.                 val <<= 1;  
  16.              }
  17.  
  18.           return binary.toString();  
  19.     }
  20. }

Un saludo
__________________
If to err is human, then programmers are the most human of us

Última edición por Profesor_Falken; 31/01/2016 a las 11:55
  #6 (permalink)  
Antiguo 31/01/2016, 17:13
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: De ASCII to bytes

Cita:
En cualquier caso aunque se utilice el ASCII extendido, un byte puede almacenar 256 valores, por lo que no deberia haber problema.
Lo que quería decir es que en la mayoría de charset a los símbolos coincidentes con los de ASCII extendido se les mantiene su número, de hecho pensaba que era con todos pero he visto que en el ejemplo de PazMudial "ª" daba dos bytes.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.

Etiquetas: ascii, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:01.