У меня есть код Java для кодирования/декодирования текста следующим образом:
public static String decode(String str, String str2) {
String str3 = "";
String decode = URLDecoder.decode(str, "UTF-8");
char[] charArray = new String(Base64.decode(decode, 0), "ISO8859-1").toCharArray();
char[] charArray2 = str2.toCharArray();
for (int i = 0; i < charArray.length; i++) {
str3 = str3 + ((char) (charArray[i] - charArray2[i % str2.length()]));
}
return str3;
}
Мне не удалось преобразовать этот фрагмент кода в С#. Следующий код генерирует неверный результат. Вот код С#
static string Base64Encode(string plainText)
{
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
return System.Convert.ToBase64String(plainTextBytes);
}
static string Base64Decode(string base64EncodedData)
{
var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}
static string ISO88591(string value)
{
Encoding iso = Encoding.GetEncoding(1252);
byte[] utfBytes = Encoding.UTF8.GetBytes(value);
byte[] isoBytes = Encoding.Convert(Encoding.UTF8, iso, utfBytes);
string msg = iso.GetString(isoBytes);
return msg;
}
public static string decode(string str, string str2)
{
string str3 = "";
string decode = HttpUtility.UrlDecode(str, Encoding.UTF8);
char[] charArray = ISO88591(Base64Decode(decode)).ToCharArray();
char[] charArray2 = str2.ToCharArray();
for (int i = 0; i < charArray.Length; i++)
{
str3 = str3 + ((char)(charArray[i] - charArray2[i % str2.Length]));
}
return str3;
}
Я застрял в течение нескольких часов, пытаясь решить эту проблему. Я понятия не имею, какая часть неверна. На самом деле он не выдает никаких ошибок, но, к сожалению, результат отличается от того, что выдает Java.
Вы тестировали каждый шаг отдельно, сравнивая кодировку/декодирование base64 в С# и Java и т. д. Кстати, вам следует рассмотреть возможность использования StringBuilder (как в Java, так и в С#); выполнение конкатенации строк в цикле (на любом языке) не является хорошей идеей
Ну похоже Encoding iso = Encoding.GetEncoding(1252); должно быть Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Это может помочь узнать, какие строки вы используете. Следует сказать, что код UTF-8 не обязательно будет передавать туда и обратно 8-битную кодировку, такую как ISO-8859-1.
Здесь просто дикая догадка, но, возможно, это связано: разница в кодировке utf8 в node.js и .NET . Разница в том, что, как объяснил CodeconValley в этом ответе, .NET и Node.JS непоследовательно обрабатывают недопустимые или недекодируемые последовательности UTF-8. Поскольку ISO-8859-1 имеет гораздо более ограниченный набор символов, чем utf-8, возможно, вы сталкиваетесь с аналогичным несоответствием здесь с тем, как две платформы обрабатывают недекодируемые символы?
Было бы полезно, если бы вы предоставили образец ввода/вывода. Не пройти необходимые этапы отладки — это одно, а полностью потребовать от нас изобретать тестовые случаи — это другое.




public static string Decode(string str, string str2)
{
string str3 = "";
string decode = Uri.UnescapeDataString(str);
char[] charArray = Encoding.GetEncoding("ISO-8859-1").GetString(Convert.FromBase64String(decode)).ToCharArray();
char[] charArray2 = str2.ToCharArray();
for (int i = 0; i < charArray.Length; i++)
{
str3 = str3 + ((char)(charArray[i] - charArray2[i % str2.Length]));
}
return str3;
}
Приведенный выше код был сгенерирован с помощью AICodeConvert.com. Вы можете попробовать.
Если бы постер хотел, чтобы код, сгенерированный ИИ, не объяснял, почему он будет работать, я думаю, они бы попросили ИИ. Сгенерированные ИИ ответы считаются не по теме, а то, как вы сформулировали свой комментарий, делает его спамом.
Я не пробовал, а не должно быть "ISO-8859-1"? с дефисами?