2009-04-06 11 views
25

VB hat ein paar native Funktionen zum Umwandeln eines Chars in einen ASCII-Wert und umgekehrt - Asc() und Chr().Was entspricht VB's Asc() und Chr() Funktionen in C#?

Jetzt muss ich die äquivalente Funktionalität in C# erhalten. Was ist der beste Weg?

+4

Bitte beachten Sie, dass selten jemand über ASCII nicht sprechen in diesen Tagen Werte. Normalerweise verwenden Sie stattdessen Unicode-Codepoints (oder eine UTF-16-Codierung): http://www.joelonsoftware.com/articles/Unicode.html –

+5

VB.Net Asc * nicht * ASCII-Codes zurück, * noch * gibt Unicode-Codes zurück. Es [gibt] zurück (http://msdn.microsoft.com/en-us/library/zew1e4wc (v = vs.71) .aspx) "ANSI" codiert in der aktuellen Windows-Codepage. – MarkJ

+0

@MarkJ Das ist genau wie VB6; Stelle dir das vor! –

Antwort

26

Sie immer einen Verweis auf Microsoft.VisualBasic hinzufügen könnte und dann genau die gleichen Methoden verwenden: Strings.Chr und Strings.Asc.

Das ist der einfachste Weg, die exakt gleiche Funktionalität zu erhalten.

+2

Wenn Sie eine Referenz hinzufügen, wird sie existieren. – Samuel

+4

+1 Für tatsächlich ** richtig **, anders als * alle * die anderen Antworten. Sie verwenden * verschiedene * Kodierungen von VB Asc und Chr und sind * falsch *. – MarkJ

+0

@MarkJ: Ich vermute, die häufigsten Verwendungen von 'Asc' und' Chr' verwenden Werte im Bereich 0-126, die der Programmierer erwarten würde, die entsprechenden Unicode-Codepunkte zuzuordnen; selbst wenn es ein System gäbe, bei dem z. B. Chr (34) "" anstatt "" ergeben würde, würde ich denken, dass der Programmierer, der 'Chr (34) schrieb, wahrscheinlich" "gemeint hatte. – supercat

18

Für Asc() können Sie die char zu einem int wie diese Stimmen:

int i = (int)your_char; 

und für Chr() können Sie zu einem char von einem int wie diese zurückgeworfen:

char c = (char)your_int; 

Hier ist ein kleines Programm, das die ganze Sache zeigt:

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 weil das * falsch * ist. VB.Net Asc * gibt keine ASCII-Codes zurück * oder * gibt Unicode-Codes zurück. Es gibt [zurück] (http://msdn.microsoft.com/en-us/library/zew1e4wc (v = vs.71) .aspx) "ANSI" -Codes in der aktuellen Windows-Codepage (dh hängt vom aktuellen Gebietsschema des Threads ab) . Die Besetzung gibt einen Unicode-Codepunkt zurück. Für die meisten Zeichen in den meisten Ländereinstellungen unterschiedlich. Verwenden Sie Microsoft.VisualBasic.Strings.Asc und Chr. – MarkJ

+1

Ich muss @MarkJ zustimmen - Ich habe diesen Code ausprobiert und er gibt für einige Zeichen (a-z, zum Beispiel) die gleichen Ergebnisse zurück, aber andere Ergebnisse für andere ("<", usw.). – JDB

+0

Ja, die Ergebnisse sind nicht gleich: {Fall 1. Strings.Chr (128) Ergebnis 1: 8364 ' {Fall 2. (char) 128 Ergebnis 2: 128' (ein Box-Wert) '} Außerdem gibt im zweiten Fall ein Wert größer als 128 'einen Box-Wert' anstelle eines gültigen Zeichens zurück. – Sadiq

2

Für Chr() können Sie:

char chr = (char)you_char_value; 
0

Bei char c und int i und Funktionen fi (int) und fc (char):

Von char in int (analog von VB Asc()): explizit das Zeichen als ein int: i = (int) c;

oder mplicitely cast (promote): fi (c), i + = c;

von INT in char (analog von VB Chr()):

explizit den int als char gegossen: c = (char) i, fc ((char) i);

Eine implizite Umwandlung ist nicht zulässig, da ein int breite ist (einen größeren Wertebereich) als ein Zeichen

0

Strings.Asc ist nicht gleichbedeutend mit einer einfachen C# -Wiedergabe für Nicht-ASCII-Zeichen, die über 127 Codewerte hinausgehen können. Die Antwort, die ich auf 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 beträgt etwa wie folgt gefunden:

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

Oder, wenn Sie einen Verweis auf Microsoft.VisualBasic Montage der Lese Deal hinzufügen möchten.

1

ich diese mit ReSharper bekam, läuft die genaue Code von VB auf Ihrem Rechner

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

Ressourcen werden nur Fehlermeldung gespeichert, so irgendwie so, wie Sie ignorieren sie wollen, und die anderen beiden Verfahren, die Sie tun haben keinen Zugang zu wie folgt sind:

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

Willkommen bei Stack Overflow! Während dieses Code-Snippet die Frage lösen kann, hilft [einschließlich einer Erklärung] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, die Qualität Ihres Posts zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch nicht, Ihren Code mit erläuternden Kommentaren zu überladen, da dies die Lesbarkeit sowohl des Codes als auch der Erklärungen verringert! – FrankerZ

+0

'Asc' und' Chr' beinhalten nicht ASCII oder sogar ISO 8859-1 (was Ihr Code tut). Sie beinhalten 'Encoding.Default'. –