2011-02-15 88 views
15

Considerar la cadena:obtener el valor ASCII de un carácter en una cadena de C#

string str="A C# string"; 

¿Cuál sería manera más eficiente de las salidas impresas en el valor ASCII de cada carácter en cadena usando C#.

+1

definen "más eficiente". :) También, posible duplicado de [Cómo obtener el valor ASCII de la cadena en C#] (http://stackoverflow.com/questions/400733/how-to-get-ascii-value-of-string-in-c). Además, ¿realmente te refieres a ASCII aquí? – bzlm

+5

Bueno, técnicamente, los caracteres C# usan UNICODE, no ASCII. –

Respuesta

9

Aquí hay una alternativa, ya que no le gusta el elenco a int:

foreach(byte b in System.Text.Encoding.UTF8.GetBytes(str.ToCharArray())) 
    Console.Write(b.ToString()); 
+0

Bueno, esto debería ser correcto si usa ASCII en lugar de UTF8 ... o si no obtiene los valores de ASCII, obtendrá los valores de UTF8 ... – Peter

+1

@Petoj - Esto se extrae directamente de los documentos de MSDN al convertir a ascii. La forma "correcta" sería llamar a 'ConvertToUTF32()' ya que esa es la verdadera codificación de los propios caracteres. –

+1

Puede extraerse de MSDN pero no estoy de acuerdo con usted en que es correcto, primero de ASCII solo contiene caracteres de 7 bits y UTF8 contiene mucho más y, en segundo lugar, algunos caracteres UTF8 se guardan como 2 bytes (o más) para que no sea capaz de determinar qué char es qué byte más ... – Peter

18

Sólo fundido cada personaje para un int:

for (int i = 0; i < str.length; i++) 
    Console.Write(((int)str[i]).ToString()); 
+1

Eso no se limitará a ASCII, ¿o sí? – bzlm

+0

+1 - También se puede repetir usando 'foreach (char c en str.ToCharArray())' –

+0

¿Se está emitiendo de la única manera? –

2

Este ejemplo podría ayudarle. mediante el uso de fundición simple puede obtener el código detrás del personaje urdu.

string str = "عثمان"; 
     char ch = ' '; 
     int number = 0; 
     for (int i = 0; i < str.Length; i++) 
     { 
      ch = str[i]; 
      number = (int)ch; 
      Console.WriteLine(number); 
     } 
+0

Debido a que un 'string' es una secuencia de contado de UTF-16 unidades de código (una o dos de las cuales codifican un punto de código Unicode), esto hará que las unidades de código UTF-16. Los puntos de código son más legibles por humanos. Para obtenerlos, conviértelos a UTF-32 porque las unidades de código UTF-32 y los puntos de código Unicode son uno a uno y tienen los mismos valores. –

0

Aquí hay otra alternativa. Por supuesto, le dará un mal resultado si la entrada de carbón no es ascii. No he probado Perf pero yo creo sería bastante rápido:

[MethodImpl(MethodImplOptions.AggressiveInlining)] 
private static int GetAsciiVal(string s, int index) { 
    return GetAsciiVal(s[index]); 
} 

[MethodImpl(MethodImplOptions.AggressiveInlining)] 
private static int GetAsciiVal(char c) { 
    return unchecked(c & 0xFF); 
} 
Cuestiones relacionadas