¿Cuál es el equivalente de las funciones Asc() y Chr() de VB en C#?
ascii table (7)
VB tiene un par de funciones nativas para convertir un char a un valor ASCII y viceversa - Asc () y Chr ().
Ahora necesito obtener la funcionalidad equivalente en C #. ¿Cuál es la mejor manera?
Dado char c y int i, y funciones fi (int) y fc (char):
De char a int (análogo de VB Asc ()): explícitamente el char es un int: int i = (int)c;
o lanzar implícitamente (promover): fi(char c) {i+= c;}
De int a char (análogo de VB Chr ()):
explícitamente el int se escribe como un char: char c = (char)i, fc(int i) {(char)i};
Un lanzamiento implícito no está permitido, ya que un int es más amplio (tiene un rango de valores mayor) que un char
Obtuve estos usando el reajuste, 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"/> < 0 or > 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 son solo mensajes de error almacenados, por lo que de alguna manera la forma en que desea ignorarlos, y los otros dos métodos a los que no tiene acceso son los siguientes:
internal static Encoding GetFileIOEncoding()
{
return Encoding.Default;
}
internal static int GetLocaleCodePage()
{
return Thread.CurrentThread.CurrentCulture.TextInfo.ANSICodePage;
}
Para Asc()
puedes convertir el char
a un int
como este:
int i = (int)your_char;
y para Chr()
puedes devolver a un char
desde un int
como este:
char c = (char)your_int;
Aquí hay un 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);
}
}
Para Chr () puedes usar:
char chr = (char)you_char_value;
Siempre puede agregar una referencia a Microsoft.VisualBasic y luego usar los mismos métodos exactos: Strings.Chr y Strings.Asc .
Esa es la forma más fácil de obtener exactamente la misma funcionalidad.
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 encontré 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 equivale 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 bien, si desea el acuerdo de lectura, agregue una referencia al ensamblado Microsoft.VisualBasic.
//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 "]"