繁体   English   中英

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

[英]Convert string of integers to ASCII chars

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

如果期望的输入值是这样的: 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()来验证输入部分

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(较低平面中的每个字符使用16位单元,对于CodePoints大于或等于2 16则使用两个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年代初稿开发第一个通用字符集(UCS) )以来,IEEE和Unicode联盟(正在开发该标准的两个主要实体)的主要目标之一就是保留与当时广泛使用的预先存在的256个字符集兼容。

保留CodePoints定义,从而随时间保留兼容性,这是Unicode 世界中的严格规则。 此概念和规则适用于所有现代可变长度Unicode编码( UTF-8UTF-16UTF-16LEUTF-32等)以及基本多语言平面中的所有CodePoint( U+0000 to U+D7FF范围内的CodePoints) U+0000 to U+D7FFU+E000 to U+FFFF )。

另一方面,即使使用相同的系统(和系统版本),也不能明确保证相同的本地CodePage编码(通常称为ANSI编码)将在两台计算机上产生相同的结果。

有关本地化和Unicode通用语言环境数据存储库(CLDR)的其他说明

您可以将问题分为两部分:

P1。 您想要输入一个用空格分隔的数字的字符串输入,并将它们转换为int值:

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

P2。 您想将这些数字转换为字符表示形式:

private static string AsciiCodesToString(int[] inputValues)
{
    var builder = new StringBuilder();
    foreach (var value in inputValues)
    {
        builder.Append((char)value);
    }
    return builder.ToString();
}

然后,您可以这样称呼它:

Console.WriteLine(AsciiCodesToString(NumbersFromString(input)));

在线尝试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM