VB 的 Asc() 和 Chr() 函数在 C# 中的等价物是什么?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/721201/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
What's the equivalent of VB's Asc() and Chr() functions in C#?
提问by Shaul Behr
VB has a couple of native functions for converting a char to an ASCII value and vice versa - Asc() and Chr().
VB 有几个本地函数用于将字符转换为 ASCII 值,反之亦然 - Asc() 和 Chr()。
Now I need to get the equivalent functionality in C#. What's the best way?
现在我需要在 C# 中获得等效的功能。最好的方法是什么?
采纳答案by Garry Shutler
You could always add a reference to Microsoft.VisualBasic and then use the exact same methods: Strings.Chrand Strings.Asc.
您始终可以添加对 Microsoft.VisualBasic 的引用,然后使用完全相同的方法:Strings.Chr和Strings.Asc。
That's the easiest way to get the exact same functionality.
这是获得完全相同功能的最简单方法。
回答by Andrew Hare
For Asc()
you can cast the char
to an int
like this:
因为Asc()
您可以将char
转换为int
这样的:
int i = (int)your_char;
and for Chr()
you can cast back to a char
from an int
like this:
因为Chr()
你可以char
从这样的 an 转换回 a int
:
char c = (char)your_int;
Here is a small program that demonstrates the entire thing:
这是一个演示整个事情的小程序:
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);
}
}
回答by Tony
For Chr() you can use:
对于 Chr() 您可以使用:
char chr = (char)you_char_value;
回答by tpdi
Given char c and int i, and functions fi(int) and fc(char):
给定 char c 和 int i,以及函数 fi(int) 和 fc(char):
From char to int (analog of VB Asc()):
explicitly cast the char as an int: int i = (int)c;
从 char 到 int(类似于 VB Asc()):将 char 显式转换为 int: int i = (int)c;
or implicitly cast (promote): fi(char c) {i+= c;}
或隐式转换(提升): fi(char c) {i+= c;}
From int to char (analog of VB Chr()):
从 int 到 char(类似于 VB Chr()):
explicitly cast the int as an char: char c = (char)i, fc(int i) {(char)i};
将 int 显式转换为字符: char c = (char)i, fc(int i) {(char)i};
An implicit cast is disallowed, as an int is wider (has a greater range of values) than a char
不允许隐式转换,因为 int 比 char 更宽(具有更大的值范围)
回答by dmihailescu
Strings.Asc is not equivalent with a plain C# cast for non ASCII chars that can go beyond 127 code value. The answer I found on https://social.msdn.microsoft.com/Forums/vstudio/en-US/13fec271-9a97-4b71-ab28-4911ff3ecca0/equivalent-in-c-of-asc-chr-functions-of-vb?forum=csharpgeneralamounts to something like this:
对于可以超过 127 个代码值的非 ASCII 字符,Strings.Asc 不等同于普通的 C# 类型转换。我在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;
}
Or, if you want the read deal add a reference to Microsoft.VisualBasic assembly.
或者,如果您希望读取交易添加对 Microsoft.VisualBasic 程序集的引用。
回答by deadManN
I got these using resharper, the exact code runs by VB on your machine
我使用 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"/> < 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]);
}
Resources are just stored error message, so somehow the way you want ignore them, and the other two method which you do not have access to are as follow:
资源只是存储错误消息,所以不知何故你想忽略它们,另外两种你无权访问的方法如下:
internal static Encoding GetFileIOEncoding()
{
return Encoding.Default;
}
internal static int GetLocaleCodePage()
{
return Thread.CurrentThread.CurrentCulture.TextInfo.ANSICodePage;
}
回答by Diego Almeida
//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 "]"
回答by Georg
in C# you can use the Char.ConvertFromUtf32 statement
在 C# 中,您可以使用 Char.ConvertFromUtf32 语句
int intValue = 65; \ Letter A
string strVal = Char.ConvertFromUtf32(intValue);
the equivalent of VB's
相当于VB的
Dim intValue as integer = 65
Dim strValue As String = Char.ConvertFromUtf32(intValue)
No Microsoft.VisualBasic reference required
不需要 Microsoft.VisualBasic 参考
回答by user10960826
Add this method into C# `
将此方法添加到 C# 中`
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;
}
}
`
`
回答by Top Systems
I have extracted the Asc() function from Microsoft.VisualBasic.dll:
我已经从 Microsoft.VisualBasic.dll 中提取了 Asc() 函数:
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;
}