将数字字符串转换为等效的ASCII字符的最佳方法是什么?
我认为这太过复杂了。
Console.WriteLine($"Enter the word to decrypt: ");
//store the values to convert into a string
string vWord = Console.ReadLine();
for (int i = 0; i < vWord.Length; i++)
{
int convertedIndex = vWord[i];
char character = (char)convertedIndex;
finalValue += character.ToString();
Console.WriteLine($"Input: {vWord[i]} Index: {convertedIndex} Char {character}");
}
答案 0 :(得分:2)
如果期望的输入值是这样的:65 66 67 97 98 99
,则可以仅分割输入并将转换后的int
值转换为char
:
string vWord = "65 66 67 97 98 99";
string result = string.Join("", vWord.Split().Select(n => (char)(int.Parse(n))));
Console.WriteLine($"Result string: {result}");
但是,此方法不对输入字符串执行任何错误检查。在处理用户输入时,这不是一个好主意。我们最好使用int.TryParse()来验证输入的 parts :
var result = new StringBuilder();
var ASCIIValues = vWord.Split();
foreach (string CharValue in ASCIIValues) {
if (int.TryParse(CharValue, out int n) && n < 127) {
result.Append((char)n);
}
else {
Console.WriteLine($"{CharValue} is not a vaid input");
break;
}
}
Console.WriteLine($"Result string: {result.ToString()}");
您还可以使用Encoding.ASCII.GetString方法将byte.Parse方法生成的Byte数组转换为字符串。例如,使用LINQ的Select
:
string vWord = "65 66 67 97 98 267";
try
{
var CharArray = vWord.Split().Select(n => byte.Parse(n)).ToArray();
string result = Encoding.ASCII.GetString(CharArray);
Console.WriteLine($"String result: {result}");
}
catch (Exception)
{
Console.WriteLine("Not a vaid input");
}
这将打印"Not a vaid input"
,因为其中一个值为> 255
。
您是否应该决定允许包含连续值的输入字符串:
651016667979899112101 => "AeBCabcpe"
您可以采用以下变体:
string vWord2 = "11065666797989911210110177";
int step = 2;
var result2 = new StringBuilder();
for (int i = 0; i < vWord2.Length; i += step)
{
if (int.TryParse(vWord2.Substring(i, step), out int n) && n < 127)
{
if (n <= 12 & i == 0) {
i = -3; step = 3; ;
}
else if(n <= 12 & i >= 2) {
step = 3; i -= step;
}
else {
result2.Append((char)n);
if (step == 3) ++i;
step = 2;
}
}
else {
Console.WriteLine($"{vWord2.Substring(i, step)} is not a vaid input");
break;
}
}
Console.WriteLine($"Result string: {result2.ToString()}");
Result string: nABCabcpeeM
应汤姆·布洛杰(Tom Blodget)的要求,提供有关自动转换的说明 在ASCII字符集和Unicode CodePoints之间。
此代码使用与ASCII表中的字符相对应的整数值生成一些ASCII字符,将该值转换为char类型并将结果转换为Windows标准Unicode(UTF-16LE
)字符串。 />
为什么无需将ASCII字符显式转换为Unicode表示形式?
因为出于历史原因,较低的Unicode CodePoints直接映射到标准ASCII表(US-ASCII表)。
因此,不需要任何转换,或者可以将其视为隐式的。
但是,由于.Net字符串类型在内部使用UTF-16LE
Unicode(对于较低的Plane中的每个字符使用16位单元,因此两个大于或等于2 < sup> 16 ),则该字符串的字节内存分配是字符数的两倍。
在.Net参考源中,StringBuilder.ToString()将调用内部wstrcpy
方法:
wstrcpy(char *dmem, char *smem, int charCount)
然后将呼叫Buffer.Memcpy
:
Buffer.Memcpy((byte*)dmem, (byte*)smem, charCount * 2);
其中字节大小设置为charCount * 2
。
自从第一稿开始,即80年代(当第一版Universal Character Set (UCS)诞生时),IEEE和Unicode联盟(两个正在开发该标准的主要实体)的主要目标之一就是:保持与当时广泛使用的256个字符集的兼容性。
在Unicode 世界中,保留CodePoints定义,从而随时间推移保持兼容性是严格的规则。此概念和规则适用于所有 modern 变长Unicode编码(UTF-8,UTF-16,UTF-16LE,UTF-32等)以及所有CodePoint Basic Multilingual Plane中的代码(在U+0000 to U+D7FF
和U+E000 to U+FFFF
范围内的CodePoints)。
另一方面,即使使用相同的系统(和系统版本),也不能明确保证相同的本地CodePage编码(通常称为ANSI编码)将在两台计算机上产生相同的结果。 / p>
关于Localization and the Unicode Common Locale Data Repository (CLDR)
的其他一些说明答案 1 :(得分:1)
您可以将问题分为两部分:
P1。您想输入一个用空格分隔的数字的字符串输入,并将它们转换为Validator::make($request->all(), [
'array.*' => [new ArrayAtLeastOneRequired()],
]);
值:
int
P2。您想将这些数字转换为字符表示形式:
private static int[] NumbersFromString(string input)
{
var parts = input.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
var values = new List<int>(parts.Length);
foreach (var part in parts)
{
int value;
if (!int.TryParse(part, out value))
{
throw new ArgumentException("One or more values in the input string are invalid.", "input");
}
values.Add(value);
}
return values.ToArray();
}
然后您可以这样称呼它:
private static string AsciiCodesToString(int[] inputValues)
{
var builder = new StringBuilder();
foreach (var value in inputValues)
{
builder.Append((char)value);
}
return builder.ToString();
}