Cómo obtener carácter para un valor ascii dado

Respuestas:

152

¿Quiere decir "A" (a string) o "A" (a char)?

int unicode = 65;
char character = (char) unicode;
string text = character.ToString();

Tenga en cuenta que me he referido a Unicode en lugar de ASCII ya que esa es la codificación de caracteres nativa de C #; esencialmente cada uno chares un punto de código UTF-16.

Jon Skeet
fuente
@Jon Skeet: si configuro unicode = 128, ¿por qué no puedo obtener el carácter correspondiente?
Iorn Man
@EthanHunt: Entonces obtendrás U + 0080, que es un personaje de control. Sospecho que estás pensando en 128 con una codificación de caracteres diferente.
Jon Skeet
@Jon skeet: en realidad quiero mostrar los valores de caracteres para 0x80, 0x81- oxFF (convierto estos valores a decimal, es decir, 128-255 pero no pude obtener el símbolo correspondiente). Cómo puedo mostrar esos símbolos también.
Iorn Man
@EthanHunt: ¿Qué quieres decir con "los valores de los caracteres"? U + 0080 es un carácter de control, ¿cómo espera que se muestre? Nuevamente, sospecho que en realidad estás hablando de valores 128-255 en alguna otra codificación, pero no nos has dicho qué codificación es esa.
Jon Skeet
@Jon Skeet: en realidad soy nuevo en c #, estoy haciendo una aplicación similar a un teclado virtual en la que quiero establecer estos caracteres en los botones como texto.
Iorn Man
35
 string c = Char.ConvertFromUtf32(65);

c contendrá "A"

Felice Pollano
fuente
13

Esto funciona en mi código.

string asciichar = (Convert.ToChar(65)).ToString();

Regreso: asciichar = 'A';

Bob Colin
fuente
8

Hay varias formas de hacer esto.

Usando char struct (para encadenar y viceversa)

string _stringOfA = char.ConvertFromUtf32(65);

int _asciiOfA = char.ConvertToUtf32("A", 0);

Simplemente lanzando el valor (se muestra el carácter y la cadena)

char _charA = (char)65;

string _stringA = ((char)65).ToString();

Usando ASCIIEncoding.
Esto se puede usar en un bucle para hacer una matriz completa de bytes

var _bytearray = new byte[] { 65 };

ASCIIEncoding _asiiencode = new ASCIIEncoding();

string _alpha = _asiiencode .GetString(_newByte, 0, 1);

Puede anular la clase de convertidor de tipos, esto le permitiría hacer una validación elegante de los valores:

var _converter = new ASCIIConverter();

string _stringA = (string)_converter.ConvertFrom(65);

int _intOfA = (int)_converter.ConvertTo("A", typeof(int));

Aquí está la clase:

public class ASCIIConverter : TypeConverter
{
    // Overrides the CanConvertFrom method of TypeConverter.
    // The ITypeDescriptorContext interface provides the context for the
    // conversion. Typically, this interface is used at design time to 
    // provide information about the design-time container.
    public override bool CanConvertFrom(ITypeDescriptorContext context,
       Type sourceType)
    {
        if (sourceType == typeof(string))
        {
            return true;
        }
        return base.CanConvertFrom(context, sourceType);
    }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(int))
        {
            return true;
        }
        return base.CanConvertTo(context, destinationType);
    }


    // Overrides the ConvertFrom method of TypeConverter.
    public override object ConvertFrom(ITypeDescriptorContext context,
       CultureInfo culture, object value)
    {

        if (value is int)
        {
            //you can validate a range of int values here
            //for instance 
            //if (value >= 48 && value <= 57)
            //throw error
            //end if

            return char.ConvertFromUtf32(65);
        }
        return base.ConvertFrom(context, culture, value);
    }

    // Overrides the ConvertTo method of TypeConverter.
    public override object ConvertTo(ITypeDescriptorContext context,
       CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(int))
        {
            return char.ConvertToUtf32((string)value, 0);
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }
}
Keith Aymar
fuente
1

También se puede hacer de otra manera

byte[] pass_byte = Encoding.ASCII.GetBytes("your input value");

y luego imprima el resultado. utilizando foreachloop.

Suhas Daitule
fuente
0

Aquí hay una función que funciona para los 256 bytes y garantiza que verá un carácter para cada valor:

static char asciiSymbol( byte val )
{
    if( val < 32 ) return '.';  // Non-printable ASCII
    if( val < 127 ) return (char)val;   // Normal ASCII
    // Workaround the hole in Latin-1 code page
    if( val == 127 ) return '.';
    if( val < 0x90 ) return "€.‚ƒ„…†‡ˆ‰Š‹Œ.Ž."[ val & 0xF ];
    if( val < 0xA0 ) return ".‘’“”•–—˜™š›œ.žŸ"[ val & 0xF ];
    if( val == 0xAD ) return '.';   // Soft hyphen: this symbol is zero-width even in monospace fonts
    return (char)val;   // Normal Latin-1
}
Pronto
fuente
Si el objetivo era obtener un punto de código Unicode visible para cada punto de código ASCII, las imágenes de control podrían usarse para reemplazar los caracteres de control C0 . ␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏…
Tom Blodget
1
@TomBlodget Es bueno saberlo, pero esa no es una respuesta a la pregunta del OP. No dude en enviar otra función de C # que hará lo que solicitó el OP.
Soonts
1
Tenga en cuenta que ASCII solo sube a 127. Cualquier cosa por encima de eso simplemente no es ASCII, por lo que al menos su método tiene un nombre deficiente.
Jon Skeet
También maneja números inesperados, increíble.
Sayed Muhammad Idrees
0

Simplemente prueba esto:

int n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("data is: {0}", Convert.ToChar(n));
Anish Kalghatkar
fuente
-1

Creo que un elenco simple puede funcionar

int ascii = (int) "A"

Carlos Valenzuela
fuente
Ahora quería ayuda con lo contrario ... Obtener un carácter de un número
StefanE
11
No es que el código dado se compile de todos modos, no puede convertir de stringa int. Si lo fuera 'A', funcionaría, pero el elenco sería redundante ya que hay una conversión implícita de chara int.
Jon Skeet
-2

Lo siento, no sé Java, pero me enfrenté al mismo problema esta noche, así que escribí esto (está en c #)

public string IncrementString(string inboundString)    {
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(inboundString.ToArray);
bool incrementNext = false;

for (l = -(bytes.Count - 1); l <= 0; l++) {
    incrementNext = false;

    int bIndex = Math.Abs(l);
    int asciiVal = Conversion.Val(bytes(bIndex).ToString);

    asciiVal += 1;

    if (asciiVal > 57 & asciiVal < 65)
        asciiVal = 65;
    if (asciiVal > 90) {
        asciiVal = 48;
        incrementNext = true;
    }

    bytes(bIndex) = System.Text.Encoding.ASCII.GetBytes({ Strings.Chr(asciiVal) })(0);

    if (incrementNext == false)
        break; // TODO: might not be correct. Was : Exit For
}

inboundString = System.Text.Encoding.ASCII.GetString(bytes);

return inboundString;
}

fuente
Para obtener todas las combinaciones, simplemente ejecútelas en un bucle.
¡El código está totalmente desordenado!
Sayed Muhammad Idrees