将整数字符串转换为ASCII字符

时间:2018-12-15 09:04:21

标签: c#

将数字字符串转换为等效的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}");
}

2 个答案:

答案 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-8UTF-16UTF-16LEUTF-32等)以及所有CodePoint Basic Multilingual Plane中的代码(在U+0000 to U+D7FFU+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();
}

Try it online