2009-04-06 69 views
25

VB tiene un par de funciones nativas para convertir un char a un valor ASCII y viceversa - Asc() y Chr().¿Cuál es el equivalente de las funciones Asc() y Chr() de VB en C#?

Ahora necesito obtener la funcionalidad equivalente en C#. ¿Cuál es la mejor manera?

+4

tenga en cuenta que rara vez alguien hablar de valores ASCII en estos días. Por lo general, utiliza los puntos de código Unicode (o su codificación UTF-16) en su lugar: http://www.joelonsoftware.com/articles/Unicode.html –

+5

VB.Net Asc * no * devuelve códigos ASCII, * ni * devuelve códigos Unicode. [Devuelve] (http://msdn.microsoft.com/en-us/library/zew1e4wc (v = vs.71) .aspx) códigos "ANSI" en la página actual de códigos de Windows. – MarkJ

+0

@MarkJ Eso es como VB6; ¡Imagínate! –

Respuesta

26

Siempre se puede añadir una referencia a Microsoft.VisualBasic y luego utilizar los mismos métodos exactos: Strings.Chr y Strings.Asc.

Esa es la forma más fácil de obtener exactamente la misma funcionalidad.

+2

Si agrega una referencia, existirá. – Samuel

+4

+1 Por ** estar en lo cierto **, a diferencia de * todas * las otras respuestas. Usan * codificaciones * diferentes de VB Asc y Chr y son * incorrectas *. – MarkJ

+0

@MarkJ: sospecho que los usos más comunes de 'Asc' y' Chr' usan valores en el rango 0-126, que el programador esperaría asignar a los puntos de código Unicode correspondientes; incluso si hubiera un sistema donde, por ejemplo, Chr (34) produciría '" 'en lugar de' "', pensaría que el programador que escribió 'Chr (34)' probablemente intentó '" '. – supercat

18

Para Asc() que puede emitir el char a un int así:

int i = (int)your_char; 

y para Chr() puede convertir de nuevo a un char de un int así:

char c = (char)your_int; 

Aquí es una pequeño programa que demuestra todo:

using System; 

class Program 
{ 
    static void Main() 
    { 
     char c = 'A'; 
     int i = 65; 

     // both print "True" 
     Console.WriteLine(i == (int)c); 
     Console.WriteLine(c == (char)i); 
    } 
} 
+11

-1 porque está * mal *. VB.Net Asc * no * devuelve códigos ASCII, * ni * devuelve códigos Unicode. [Devuelve] (http://msdn.microsoft.com/en-us/library/zew1e4wc (v = vs.71) .aspx) Códigos "ANSI" en la página actual de códigos de Windows (es decir, depende de la configuración regional del hilo actual) . El elenco devolverá un punto de código Unicode. Diferente para la mayoría de los personajes en la mayoría de las configuraciones regionales. Utilice Microsoft.VisualBasic.Strings.Asc y Chr. – MarkJ

+1

Tengo que estar de acuerdo con @MarkJ - Intenté este código y devuelve los mismos resultados para algunos caracteres (a-z, por ejemplo) pero resultados diferentes para otros ("<", etc.). – JDB

+0

Sí, los resultados no son los mismos: {case 1. Strings.Chr (128) resultado 1: 8364 '€'} {case 2. (char) 128 resultado 2: 128 '(valor de un recuadro)'} Además, en el segundo caso, cualquier valor mayor a 128 devuelve 'un valor de caja' en lugar de un carácter válido. – Sadiq

2

Para Chr() se puede utilizar:

char chr = (char)you_char_value; 
0

Dada carbón cy int i, y las funciones fi (int) y FC (char):

de char a int (análogo de VB Asc()): expulsa explícitamente el carácter char como int: i = (int) c;

o mplicitly cast (promote): fi (c), i + = c;

de int a char (análogo de la VB Chr()):

fundido explícitamente la int como un Char: c = (char) i, fc ((char) i);

una conversión implícita será anulado, como un int es más ancho (tiene un mayor rango de valores) que un char

0

Strings.Asc no es equivalente con un elenco simple de C# para caracteres no ASCII que pueden ir más allá del valor del código 127. La respuesta que he encontrado en https://social.msdn.microsoft.com/Forums/vstudio/en-US/13fec271-9a97-4b71-ab28-4911ff3ecca0/equivalent-in-c-of-asc-chr-functions-of-vb?forum=csharpgeneral asciende a algo como esto:

static int Asc(char c) 
    { 
     int converted = c; 
     if (converted >= 0x80) 
     { 
      byte[] buffer = new byte[2]; 
      // if the resulting conversion is 1 byte in length, just use the value 
      if (System.Text.Encoding.Default.GetBytes(new char[] { c }, 0, 1, buffer, 0) == 1) 
      { 
       converted = buffer[0]; 
      } 
      else 
      { 
       // byte swap bytes 1 and 2; 
       converted = buffer[0] << 16 | buffer[1]; 
      } 
     } 
     return converted; 
    } 

O, si se quiere que el acuerdo lectura añadir una referencia al ensamblaje Microsoft.VisualBasic.

1

obtuve estas usando ReSharper, el código exacto corre por VB en su máquina

/// <summary> 
/// Returns the character associated with the specified character code. 
/// </summary> 
/// 
/// <returns> 
/// Returns the character associated with the specified character code. 
/// </returns> 
/// <param name="CharCode">Required. An Integer expression representing the <paramref name="code point"/>, or character code, for the character.</param><exception cref="T:System.ArgumentException"><paramref name="CharCode"/> &lt; 0 or &gt; 255 for Chr.</exception><filterpriority>1</filterpriority> 
public static char Chr(int CharCode) 
{ 
    if (CharCode < (int) short.MinValue || CharCode > (int) ushort.MaxValue) 
    throw new ArgumentException(Utils.GetResourceString("Argument_RangeTwoBytes1", new string[1] 
    { 
     "CharCode" 
    })); 
    if (CharCode >= 0 && CharCode <= (int) sbyte.MaxValue) 
    return Convert.ToChar(CharCode); 
    try 
    { 
    Encoding encoding = Encoding.GetEncoding(Utils.GetLocaleCodePage()); 
    if (encoding.IsSingleByte && (CharCode < 0 || CharCode > (int) byte.MaxValue)) 
     throw ExceptionUtils.VbMakeException(5); 
    char[] chars = new char[2]; 
    byte[] bytes = new byte[2]; 
    Decoder decoder = encoding.GetDecoder(); 
    if (CharCode >= 0 && CharCode <= (int) byte.MaxValue) 
    { 
     bytes[0] = checked ((byte) (CharCode & (int) byte.MaxValue)); 
     decoder.GetChars(bytes, 0, 1, chars, 0); 
    } 
    else 
    { 
     bytes[0] = checked ((byte) ((CharCode & 65280) >> 8)); 
     bytes[1] = checked ((byte) (CharCode & (int) byte.MaxValue)); 
     decoder.GetChars(bytes, 0, 2, chars, 0); 
    } 
    return chars[0]; 
    } 
    catch (Exception ex) 
    { 
    throw ex; 
    } 
} 


/// <summary> 
/// Returns an Integer value representing the character code corresponding to a character. 
/// </summary> 
/// 
/// <returns> 
/// Returns an Integer value representing the character code corresponding to a character. 
/// </returns> 
/// <param name="String">Required. Any valid Char or String expression. If <paramref name="String"/> is a String expression, only the first character of the string is used for input. If <paramref name="String"/> is Nothing or contains no characters, an <see cref="T:System.ArgumentException"/> error occurs.</param><filterpriority>1</filterpriority> 
public static int Asc(char String) 
{ 
    int num1 = Convert.ToInt32(String); 
    if (num1 < 128) 
    return num1; 
    try 
    { 
    Encoding fileIoEncoding = Utils.GetFileIOEncoding(); 
    char[] chars = new char[1] 
    { 
     String 
    }; 
    if (fileIoEncoding.IsSingleByte) 
    { 
     byte[] bytes = new byte[1]; 
     fileIoEncoding.GetBytes(chars, 0, 1, bytes, 0); 
     return (int) bytes[0]; 
    } 
    byte[] bytes1 = new byte[2]; 
    if (fileIoEncoding.GetBytes(chars, 0, 1, bytes1, 0) == 1) 
     return (int) bytes1[0]; 
    if (BitConverter.IsLittleEndian) 
    { 
     byte num2 = bytes1[0]; 
     bytes1[0] = bytes1[1]; 
     bytes1[1] = num2; 
    } 
    return (int) BitConverter.ToInt16(bytes1, 0); 
    } 
    catch (Exception ex) 
    { 
    throw ex; 
    } 
} 


/// <summary> 
/// Returns an Integer value representing the character code corresponding to a character. 
/// </summary> 
/// 
/// <returns> 
/// Returns an Integer value representing the character code corresponding to a character. 
/// </returns> 
/// <param name="String">Required. Any valid Char or String expression. If <paramref name="String"/> is a String expression, only the first character of the string is used for input. If <paramref name="String"/> is Nothing or contains no characters, an <see cref="T:System.ArgumentException"/> error occurs.</param><filterpriority>1</filterpriority> 
public static int Asc(string String) 
{ 
    if (String == null || String.Length == 0) 
    throw new ArgumentException(Utils.GetResourceString("Argument_LengthGTZero1", new string[1] 
    { 
     "String" 
    })); 
    return Strings.Asc(String[0]); 
} 

Los recursos se acaba de registrar mensaje de error, por lo que de alguna manera la forma en que desea ignorarlos, y los otros dos método que lo hace no tienen acceso a son los siguientes:

internal static Encoding GetFileIOEncoding() 
{ 
    return Encoding.Default; 
} 

internal static int GetLocaleCodePage() 
{ 
    return Thread.CurrentThread.CurrentCulture.TextInfo.ANSICodePage; 
} 
0
//Char to Int - ASC("]") 
int lIntAsc = (int)Char.Parse("]"); 
Console.WriteLine(lIntAsc); //Return 91 



//Int to Char 

char lChrChar = (char)91; 
Console.WriteLine(lChrChar); //Return "]" 
+1

¡Bienvenido a Stack Overflow! Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. Por favor, intente no saturar su código con comentarios explicativos, ya que esto reduce la legibilidad tanto del código como de las explicaciones. – FrankerZ

+0

'Asc' y' Chr' no implican ASCII o incluso ISO 8859-1 (que es lo que hace su código). Implican 'Encoding.Default'. –

Cuestiones relacionadas