¿Cómo convertir una cadena de Java en una matriz de bytes ASCII?

Respuestas:

157

Usando el getBytesmétodo, dándole el Charset(o Charsetnombre) apropiado .

Ejemplo:

String s = "Hello, there.";
byte[] b = s.getBytes(StandardCharsets.US_ASCII);

(Antes de Java 7: byte[] b = s.getBytes("US-ASCII");)

Sebastian Paaske Tørholm
fuente
10
Estoy un poco avergonzado por lo fácil que fue.
granja de avestruz
4
Esto convertirá los caracteres no asignables como '\ u00e0' (& agrave;) en '?'. Sería mejor tener un método que convierta eso en 'a'.
Arnout Engelen
11
Para las personas que usan Java 7 o posterior, use la clase StandardCharsets que contiene algunas constantes para juegos de caracteres estándar. byte[] b = s.getBytes(StandardCharsets.US_ASCII);
Alexis C.
23

Si eres un usuario hay una Charsetsclase útil :

String s = "Hello, world!";
byte[] b = s.getBytes(Charsets.US_ASCII);

Aparte de no codificar de forma rígida el nombre del juego de caracteres arbitrario en su código fuente, tiene una ventaja mucho mayor: Charsets.US_ASCIIes de Charsettipo (no String), por lo que evita que se verifiquen UnsupportedEncodingExceptionarrojados solo desde String.getBytes(String), pero no desde String.getBytes(Charset).

En Java 7 existe una StandardCharsetsclase equivalente .

Tomasz Nurkiewicz
fuente
lamentablemente, String.getBytes(Charset)no se agregó hasta la API 9 :( Entonces, si desea apuntar a Froyo y superior, no puede hacerlo.
yincrash
5

Solo hay un carácter incorrecto en el código que probó:

Charset characterSet = Charset.forName("US-ASCII");
String string = "Wazzup";
byte[] bytes = String.getBytes(characterSet);
               ^

Observe la "Cadena" en mayúscula. Esto intenta invocar un método estático en la clase de cadena, que no existe. En su lugar, debe invocar el método en su instancia de cadena:

byte[] bytes = string.getBytes(characterSet);
Jörn Horstmann
fuente
Si es así, ¿podría decirme cómo podría ser que una letra hebrea se toma 1 byte (codificación ascii), ni siquiera existe en el ascii? y no está usando encodung predeterminado ya que lo especifiqué manualmente. i.stack.imgur.com/5WPD3.jpg
Royi Namir
@RoyiNamir: Esto podría publicarse mejor como una nueva pregunta, pero la razón es que el carácter no se puede codificar en US-ASCII y el getBytes(Charset)método se especifica para reemplazar los caracteres que no se pueden codificar. Con US-ASCII, este carácter de reemplazo es el signo de interrogación, por lo que su matriz de bytes contiene un elemento con el valor ASCII de '?' (63).
Jörn Horstmann
5

El problema con otras soluciones propuestas es que eliminarán caracteres que no se pueden asignar directamente a ASCII o los reemplazarán con un carácter marcador como ?.

Es posible que desee, por ejemplo, que los caracteres acentuados se conviertan en ese mismo carácter sin el acento. Hay un par de trucos para hacer esto (incluida la construcción de una tabla de mapeo estático usted mismo o el aprovechamiento de la 'normalización' existente definida para Unicode), pero esos métodos están lejos de ser completos.

Su mejor opción es usar la biblioteca junidecode , que tampoco puede ser completa pero que incorpora mucha experiencia en la forma más sensata de transliterar Unicode a ASCII.

Arnout Engelen
fuente
4
String s = "ASCII Text";
byte[] bytes = s.getBytes("US-ASCII");
Babar
fuente
4

Si necesita esto en Android y quiere que funcione con algo más antiguo que FroYo, también puede usar EncodingUtils.getAsciiBytes () :

byte[] bytes = EncodingUtils.getAsciiBytes("ASCII Text");
dain
fuente
1
¡Este es realmente un buen consejo! En Android getBytes (...) NO funciona correctamente incluso en ICS +
extraño
¿No puedo encontrar EncodingUtils en ninguna parte?
behelit
1
@behelit, si sigue mi enlace, redirige a este bit: developer.android.com/about/versions/marshmallow/… Básicamente, dice que debe incluir manualmente la biblioteca HTTP de Apache, ya que ahora está en desuso.
dain
Pero si solo está buscando los documentos, la búsqueda de "apache http encodingutils" da algunos resultados útiles como: hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/…
dain
3

En mi cadena tengo caracteres tailandeses (codificados en TIS620) y diéresis alemanas. La respuesta de Agiles me puso en el camino correcto. En lugar de .getBytes () que uso ahora

  int len = mString.length(); // Length of the string
  byte[] dataset = new byte[len];
  for (int i = 0; i < len; ++i) {
     char c = mString.charAt(i);
     dataset[i]= (byte) c;
  }
thpitsch
fuente
0

Convierte cadenas a valores ascii.

   String test = "ABCD";

   for ( int i = 0; i < test.length(); ++i ) {
   char c = test.charAt( i );
   int j = (int) c;
   System.out.println(j);
   }
ágiles
fuente
-2

Prueba esto:

/**
 * @(#)demo1.java
 *
 *
 * @author 
 * @version 1.00 2012/8/30
 */

import java.util.*;

public class demo1 
{
    Scanner s=new Scanner(System.in);

    String str;
    int key;

    void getdata()
    {
        System.out.println ("plase enter a string");
        str=s.next();
        System.out.println ("plase enter a key");
        key=s.nextInt();
    }

    void display()
    {
        char a;
        int j;
        for ( int i = 0; i < str.length(); ++i )
        {

            char c = str.charAt( i );
            j = (int) c + key;
            a= (char) j;

            System.out.print(a);  
        }

        public static void main(String[] args)
        {
            demo1 obj=new demo1();
            obj.getdata();
            obj.display();
        }
    }
}
rótula de nitina
fuente