Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2017, 23:37   #1
Prolific
 
Регистрация: 07.07.2017
Сообщений: 9
По умолчанию Сбитая кодировка

Всем хай. Сбивается кодировка. Фишка в том, что я получаю строку, делаю с ней разные манипуляции, а на выходе билеберда. Сам код функций работающих со строкой:
Код:
private string decode(string str)
{
    string tstr;
    var reg_pattern = new Regex(@"audio_api_unavailable");
    if (reg_pattern.IsMatch(str))
    {
        string[] vals = str.Split(new string[] { "?extra=" }, StringSplitOptions.RemoveEmptyEntries)[1].Split('#');
        tstr = vk_o(vals[0]);
        string ops = vk_o(vals[1]);
        string[] ops_arr = new string[10];
        ops_arr = ops.Split(new char[] { Convert.ToChar(9) });
        int len = ops_arr.Length;
        string[] args_arr = new string[10];
        string op_ind;
        for (int i = len - 1; i >= 0; i--)
        {
            args_arr = ops_arr[i].Split(new char[] { Convert.ToChar(11) });
            op_ind = args_arr[0];
            switch (op_ind)
            {
                case "v": tstr = vk_v(tstr); break;
                case "r": tstr = vk_r(tstr, args_arr[1]); break;
                case "x": tstr = vk_x(tstr, args_arr[1]); break;
            }
        }
    }
    else
        return str;
    return tstr;
}
private string vk_o(string t)
{
    string a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN0PQRSTUVWXYZO123456789+/=";
    //if (String.IsNullOrEmpty(t) || t.Length % 4 == 1)
    //    return "";
    string result = "";
    int sym_index, len = t.Length,
        i = 0, shift, index2 = 0;
            
    for(int s = 0; s < len; s++)
    {
        sym_index = a.IndexOf(t[s]);
        if(sym_index != 0)
        {
            i = ((index2 % 4) != 0) ? ((i << 6) + sym_index) : sym_index;
            if (index2 % 4 != 0)
            {
                index2++;
                shift = -2 * index2 & 6;
                result += Convert.ToString((char)(255 & (i >> shift)));
            }
            else
                index2++;
        }
    }
    return result;
}

private string vk_v(string str)
{
    return reverse(str);
}

private string vk_r(string str, string i)
{
    string vk_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN0PQRSTUVWXYZO123456789+/=";
    string vk_str2 = vk_str + vk_str;
    int vk_str2_len = vk_str2.Length;
    int len = str.Length;
    string result = "";

    for(int s = 0, index, offset; s < len; s++) 
    {
        index = vk_str2.IndexOf(str[s]);
        if (index != 0)
        {
            offset = index - Convert.ToInt32(i);
            if (offset < 0)
                offset += vk_str2_len;
            result += vk_str2[offset];
        }
        else
            result += str[s];
    }
    return result;
}

private string vk_x(string str, string i)
{
    int xor_val = i[0];

    int str_len = str.Length;
    string result = "";

    for(int k = 0; k < str_len; k++)
    {
        result += Convert.ToChar(str[k] ^ xor_val);
    }


    return result;
}
Вызов функции:
Код:
richTextBox1.Text = decode("https://vk.com/mp3/audio_api_unavailable.mp3?extra=xI5scd1un1ftiHOflsWwia4Iba4veqKpdJrrkImHcvaoic0tfrCPnL0EuHC2vY0FjceqxZmTxJ5EiLiTwJjmdcS+usmklYqLiY1xjGWviGiusaOXhWmodsriaIivmXCvxXCetb9uaYK9pYqfeW4Dac4reX4IkI4pfsaJfJCif1ipfsLmtd8kiIaHktCWhq9vva8ncvbymWeestq/mt8XxZ8XxZuXm1yoaKHrdfrwnt81pJiYmtemvJeZpZm1pLjwbajssuGbva9qdGXjmGSoavzwxq4bdq1m#CGS1nqL4c2CjDG");
Что получаю на выходе:
Код:
jjGjjjjjjjhEjnjYpijcEjjjjjjjjj5jjjjjjjjjd5jPjj1DbjBjjBjDjjjjG6jljjj=jjjjjj+0w7hhXBrczyZAjajjjjjhjjjj6djjjj4jjDjjYjjhjjiMtsnH5Tdyja6jjjjjjj+jjjj66jjjijjjjjjjjjjjjjjjijjjjjahjjjjG4jEjjjjGdjjjNAUTlJ0bdZa9ycSg
Что должно быть:
Код:
https://psv4.userapi.com/c813735/u55448171/audios/351f57f57572.mp3?extra=rJ6ZXPQ0w7hhXBrczyZANQBrSW0IDFSqJsDlM79XnaHhmzfBz3B0oiMtsnH5tiCo0BuKYTNLMRwNd8Vuh4jTc0g8gT3fGPMHWYOzcIjOXzBDWQsexPNWd2srxFBsm0sQAUTlJ0bdZa9ycSg
Prolific вне форума Ответить с цитированием
Старый 16.08.2017, 07:30   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Строки в C# в юникоде, а работаете как с однобайтовыми, вот где-то что-то не так и происходит скорее всего.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сбитая кодировка, как расшифровать строку? garuna Общие вопросы Delphi 5 07.07.2016 15:50
кодировка DvAlex HTML и CSS 3 04.03.2013 10:04
Кодировка Gennadiy БД в Delphi 3 10.01.2013 14:15
кодировка Ast PHP 3 10.01.2012 08:03
кодировка asil Общие вопросы Delphi 1 23.05.2009 09:55