Подтвердить что ты не робот

Что эквивалентно функциям VB Asc() и Chr() в С#?

У VB есть несколько собственных функций для преобразования a char в значение ASCII и наоборот - Asc() и Chr().

Теперь мне нужно получить эквивалентную функциональность в С#. Какой лучший способ?

4b9b3361

Ответ 1

Вы всегда можете добавить ссылку на Microsoft.VisualBasic, а затем использовать те же самые методы: Strings.Chr и Strings.Asc.

Это самый простой способ получить ту же функциональность.

Ответ 2

Для Asc() вы можете применить char к int следующим образом:

int i = (int)your_char;

а для Chr() вы можете вернуться к char из int следующим образом:

char c = (char)your_int;

Вот небольшая программа, которая демонстрирует всю вещь:

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);
    }
}

Ответ 3

Я получил их с помощью resharper, точный код, выполняемый VB на вашем компьютере

/// <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]);
}

Ресурсы - это просто сообщение об ошибке, поэтому каким-то образом вы игнорируете их, а два других метода, к которым у вас нет доступа, следующие:

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

internal static int GetLocaleCodePage()
{
    return Thread.CurrentThread.CurrentCulture.TextInfo.ANSICodePage;
}

Ответ 4

Strings.Asc не эквивалентен простому С# cast для символов не ASCII, которые могут превышать 127 значений кода. Ответ, который я нашел на 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 что-то вроде этого:

    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;
    }

Или, если вы хотите, чтобы транзакция чтения добавила ссылку на сборку Microsoft.VisualBasic.

Ответ 5

Для Chr() вы можете использовать:

char chr = (char)you_char_value;

Ответ 6

в С# вы можете использовать оператор Char.ConvertFromUtf32

int intValue = 65;                                \\ Letter A    
string strVal = Char.ConvertFromUtf32(intValue);

эквивалент VB

Dim intValue as integer = 65     
Dim strValue As String = Char.ConvertFromUtf32(intValue) 

Ссылка на Microsoft.VisualBasic не требуется

Ответ 7

Добавьте этот метод в С# '

private  int Asc(char String)
        {
            int int32 = Convert.ToInt32(String);
            if (int32 < 128)
                return int32;
            try
            {
                Encoding fileIoEncoding = Encoding.Default;
                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 num = bytes1[0];
                    bytes1[0] = bytes1[1];
                    bytes1[1] = num;
                }
                return (int)BitConverter.ToInt16(bytes1, 0);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

'

Ответ 8

Я извлек функцию Asc() из Microsoft.VisualBasic.dll:

    public static int Asc(char String)
    {
        int num;
        byte[] numArray;
        int num1 = Convert.ToInt32(String);
        if (num1 >= 128)
        {
            try
            {
                Encoding fileIOEncoding = Encoding.Default;
                char[] str = new char[] { String };
                if (!fileIOEncoding.IsSingleByte)
                {
                    numArray = new byte[2];
                    if (fileIOEncoding.GetBytes(str, 0, 1, numArray, 0) != 1)
                    {
                        if (BitConverter.IsLittleEndian)
                        {
                            byte num2 = numArray[0];
                            numArray[0] = numArray[1];
                            numArray[1] = num2;
                        }
                        num = BitConverter.ToInt16(numArray, 0);
                    }
                    else
                    {
                        num = numArray[0];
                    }
                }
                else
                {
                    numArray = new byte[1];
                    fileIOEncoding.GetBytes(str, 0, 1, numArray, 0);
                    num = numArray[0];
                }
            }
            catch (Exception exception)
            {
                throw exception;
            }
        }
        else
        {
            num = num1;
        }
        return num;
    }

Ответ 9

//Вы можете создать функцию без необходимости менять программу

 private int Chr(int i)
  {
    return (char)i;
  }

благодаря Сонеру Генюлю

Ответ 10

Даны char c и int i, а также функции fi (int) и fc (char):

От char к int (аналог VB Asc()): явно приведите char как int: int я = (int)c;

или неявно разыграть (продвинуть): fi(char c) {i+= c;}

От int до char (аналог VB Chr()):

явно приведите int как char: char c = (char)i, fc(int i) {(char)i};

Неявное приведение не разрешено, так как int шире (имеет больший диапазон значений), чем char

Ответ 11

 //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 "]"