Всем хай. Сбивается кодировка. Фишка в том, что я получаю строку, делаю с ней разные манипуляции, а на выходе билеберда. Сам код функций работающих со строкой:
Код:
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