Преобразование кода ASCII в исходную строку в С#

Я пытаюсь преобразовать код String to ASCII, поэтому я использую эту функцию:

        public List<string> PrimaryCode(string OrginalStr)
        {
            List<string> lstResult = new List<string>();
            int lenOrginal = OrginalStr.Length;
            string subOrginalStr;
            byte[] AsciisubOrginalStr;
            int AC;

            for (int i = 0; i < lenOrginal; i++)
            {
                subOrginalStr = OrginalStr.Substring(i, 1);
                AsciisubOrginalStr = Encoding.ASCII.GetBytes(subOrginalStr);
                if (AsciisubOrginalStr[0] > 100)
                {
                    AC = Convert.ToInt32(AsciisubOrginalStr[0]);
                    lstResult.Add((AC ).ToString());
                }
                else
                {
                    AC = Convert.ToInt32(AsciisubOrginalStr[0]);
                    lstResult.Add((AC).ToString());
                }
            }
            return lstResult;
        }

В другой части моего проекта мне нужно преобразовать код ASCII в исходный текст, как вы можете видеть, я использую эту функцию:

   public List<string> PrimaryCodeRev(List<string> CodedStr)
{
    string res = "";
    foreach (string s in CodedStr)
    {
        res = res+s;
    }
    List<string> lstResult = new List<string>();
    int lenOrginal = res.Length;
    string subOrginalStr;
    byte[] AsciisubOrginalStr;
    int AC;

    for (int i = 0; i < lenOrginal; i++)
    {
        subOrginalStr = res.Substring(i, 1);
        AsciisubOrginalStr = Encoding.ASCII.GetBytes(subOrginalStr);
        if (AsciisubOrginalStr[0] < 100)
        {
            AC = Convert.ToInt32(AsciisubOrginalStr[0]);
            lstResult.Add((AC).ToString());
        }
        else
        {
            AC = Convert.ToInt32(AsciisubOrginalStr[0]);
            lstResult.Add((AC).ToString());
        }
    }
    return lstResult;
}

Строковый ввод hello

преобразовать в ascii результат:

введите здесь описание изображения

Преобразование ascii в основной текст:

введите здесь описание изображения

Но это не работает и не возвращает основной текст. Почему ?


person Ehsan Akbar    schedule 22.09.2014    source источник
comment
Будьте конкретны в сообщении нам о том, что это не работает.   -  person    schedule 22.09.2014
comment
Между прочим, я вижу только один символ различия между этими двумя методами (выражение if). Вы обязательно должны подумать о рефакторинге.   -  person    schedule 22.09.2014
comment
Хорошо, я добавлю свой результат как можно скорее   -  person Ehsan Akbar    schedule 22.09.2014
comment
См. это .. stackoverflow.com/questions/10349753/   -  person vikky    schedule 22.09.2014
comment
Это не имеет для меня никакого реального смысла. Encoding.ASCII.GetBytes() и Encoding.ASCII.GetString() преобразуются в ASCII и из него. Для чего предназначен весь этот код в Q? Зачем вам нужен список строк с числовыми кодами символов? Ваши две функции идентичны. Вам нужен только один из них. Зачем две функции, которые делают одинаковые вещи? И если вы преобразуете string в List<string>, то обратное преобразование List<string> в string. Я предлагаю вам попытаться объяснить на высоком уровне, что вы пытаетесь сделать.   -  person David Heffernan    schedule 22.09.2014
comment
@DavidHeffernan, вы знаете, я просто хочу закодировать свои данные для создания лицензии, я новичок в коде ascci   -  person Ehsan Akbar    schedule 22.09.2014
comment
Гораздо лучше было бы преобразовать строку в UTF-8, а затем закодировать ее в base64.   -  person David Heffernan    schedule 22.09.2014
comment
@DavidHeffernan, не могли бы вы привести пример для более подробной информации?   -  person Ehsan Akbar    schedule 22.09.2014
comment
Нелегко ответить на вопрос, который вы задали. Когда было бы полезно понять, почему вам вообще нужно преобразовать строку. Почему нельзя использовать как есть.   -  person David Heffernan    schedule 22.09.2014
comment
Если ваша функция допускает только диапазон символов Unicode ASCII, она должна выполнить проверку и выдать ArgumentException, если строка содержит другие символы. С другой стороны, почему она должна быть такой ограниченной?   -  person Tom Blodget    schedule 23.09.2014


Ответы (2)


Вы, кажется, слишком усложняете...

Если ваша входная строка всегда содержит только символы ASCII (что должно быть требованием), вы можете закодировать ее следующим образом:

public static IEnumerable<string> ToDecimalAscii(string input)
{
    return input.Select(c => ((int)c).ToString());
}

Вы можете преобразовать его обратно в строку следующим образом:

public static string FromDecimalAscii(IEnumerable<string> input)
{
    return new string(input.Select(s => (char)int.Parse(s)).ToArray());
}

Объединяем это в компилируемую консольную программу:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            string original = "hello";

            var encoded = ToDecimalAscii(original);

            Console.WriteLine("Encoded:");
            Console.WriteLine(string.Join("\n", encoded));

            Console.WriteLine("\nDecoded: " + FromDecimalAscii(encoded));
        }

        public static IEnumerable<string> ToDecimalAscii(string input)
        {
            return input.Select(c => ((int)c).ToString());
        }

        public static string FromDecimalAscii(IEnumerable<string> input)
        {
            return new string(input.Select(s => (char)int.Parse(s)).ToArray());
        }
    }
}

Позвольте мне повторить: это будет работать ТОЛЬКО, если ваша входная строка гарантированно содержит только символы, которые находятся в наборе ASCII.


Это на самом деле не отвечает на вопрос, почему вы хотите это сделать. Если вы пытаетесь что-то закодировать, вам может быть лучше использовать какой-то метод шифрования, который выводит массив байтов и преобразует этот массив в базу 64.

Для меня это вопрос XY.

person Matthew Watson    schedule 22.09.2014

Для получения кода Ascii просто сделайте следующее.

byte[] asciiBytes = Encoding.ASCII.GetBytes(value);

Для строки из кода AScii,

char c1 = (char) asciiCode;
person mrsrizan    schedule 22.09.2014