我需要将几行PHP代码转换为C#。但是,我只有基本的知识,我还不了解阵列。
以下是我需要转换为C#的代码:
function decode_char($c, $a1, $a2)
{
$result = $c;
for($j = 0; $j < count($a1); $j++) {
if ($c == $a1[$j][0]) {
$result = $a2[$j][0];
break;
}
if ($c == $a2[$j][0]) {
$result = $a1[$j][0];
break;
}
}
return $result;
}
function decode_str($s)
{
$a1 = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "W", "G", "X", "M", "H", "R", "U", "Z", "I", "D", "=", "N", "Q", "V", "B", "L");
$a2 = array("b", "z", "a", "c", "l", "m", "e", "p", "s", "J", "x", "d", "f", "t", "i", "o", "Y", "k", "n", "g", "r", "y", "T", "w", "u", "v");
$result = '';
for($i = 0; $i < strlen($s); $i++) {
$result .= decode_char($s[$i], $a1, $a2);
}
$result = base64_decode($result);
return $result;
}
这是我到目前为止所得到的:
public string decode_str(string s)
{
string[] a1 = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "W", "G", "X", "M", "H", "R", "U", "Z", "I", "D", "=", "N", "Q", "V", "B", "L" };
string[] a2 = { "b", "z", "a", "c", "l", "m", "e", "p", "s", "J", "x", "d", "f", "t", "i", "o", "Y", "k", "n", "g", "r", "y", "T", "w", "u", "v" };
string result = "";
for (int i = 0; i < s.Length; i++)
{
result += decode_char(s[i], a1, a2);
}
return result;
}
有人可以帮助转换decode_char
吗?
感谢您的快速解答。我已经自己做了,但是使用字符串而不是字符,所以明天我会修改代码时接受答案。
答案 0 :(得分:2)
这应该相当于decode_char
public char decodeChar(char c, string[] a, string[] a2)
{
for(var j = 0; j < a.Length; j++)
{
if(c == a1[j])
return a2[j];
if(c == a2[j])
return a1[j];
}
return c;
}
答案 1 :(得分:1)
很简单:
String DecodeChar(char c, string[] a1, string[] a2) {
for(int i=0; i<a1.length; ++i) {
if(a1[i] == c) return a2[i];
if(a2[i] == c) return a1[i];
}
return c;
}
或:
String DecodeChar(char c, string[] a1, string[] a2) {
var a1Id = Array.IndexOf(a1.ToCharArray(), c);
var a2Id = Array.IndexOf(a2.ToCharArray(), c);
if(a1Id != -1 && a1Id < a2Id) return a2[a1Id];
if(a2Id != -1 && a2Id < a1Id) return a1[a1Id];
return c;
}
答案 2 :(得分:1)
试试这个:
char decode_char(char c, string a1, string a2)
{
for (int i = 0; i < a1.Length; i++)
{
if (c == a1[i]) return a2[i];
if (c == a2[i]) return a1[i];
}
return c;
}
string decode_str(string s)
{
const string a1 = "0123456789WGXMHRUZID=NQVBL";
const string a2 = "bzaclmepsJxdftioYkngryTwuv";
StringBuilder sb = new StringBuilder();
foreach (char c in s)
sb.Append(decode_char(c, a1, a2));
return DecodeFrom64(sb.ToString());
}
string DecodeFrom64(string encodedData)
{
byte[] encBytes = Convert.FromBase64String(encodedData);
return Text.Encoding.Unicode.GetString(encBytes);
}
答案 3 :(得分:1)
我会尝试重写decode_char;这并不困难......
public char decode_char(char input, string[] array1, string[] array2)
{
var result = input;
for(var j = 0; j < array1.Length; j++)
{
if (input == array1[j][0]) {
result = array2[j][0];
break;
}
if (input == array2[j][0]) {
result = array1[j][0];
break;
}
}
return result;
}
这将适用于你已经拥有的东西。但是,我看到了改进的余地。在C#中,char和字符串[1]之间存在语义差异。如果将数组定义为字符数组而不是字符串数组,则它们不再必须是“二维”的;你可以简单地引用字符的索引而不是给定索引处字符串的第一个字符的索引。
您通常也不应该在C#中使用+ = with strings。字符串是不可改变的;创建一个实例,如果更改,则创建一个新实例,并将该变量保存的引用移动到新实例;旧实例然后挂起,直到GCed。结果是每个+ =操作创建一个全新的字符串,除了其中一个几乎立即无用,这是浪费内存。相反,有一个名为StringBuilder的类可以减少这种“颠簸”并节省内存:
此外,定义一个空字符串文字是不好的做法。它被创建为一个常量,唯一且与所有其他定义的文字分开,再次浪费内存。 String类上可用的String.Empty常量是一个集中变量,表示空字符串文字。
最后,C#最佳实践说明了描述性地命名变量。 C,S,A1和A2不是很好的标识符。
public string decode_str(string input)
{
char[] array1 = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'W', 'G', 'X', 'M', 'H', 'R', 'U', 'Z', 'I', 'D', '=', 'N', 'Q', 'V', 'B', 'L' };
char[] array2 = { 'b', 'z', 'a', 'c', 'l', 'm', 'e', 'p', 's', 'J', 'x', 'd', 'f', 't', 'i', 'o', 'Y', 'k', 'n', 'g', 'r', 'y', 'T', 'w', 'u', 'v' };
StringBuilder result = new StringBuilder(String.Empty);
for (int i = 0; i < input.Length; i++)
{
result.Add(decode_char(input[i], array1, array2));
}
return result.ToString();
}
最后,C#有一些额外的技巧,PHP显然不会使你的decode_char函数更简洁:
public char decode_char(char input, char[] array1, char[] array2)
{
return array1.Contains(input)
? array2[array1.IndexOf(input)]
: array2.Contains(input)
? array1[array2.IndexOf(input)];
: input;
}