Перевод с php на c#

387
26 сентября 2017, 04:12

Перевожу с php:

function shr32($x, $bits) 
{ 
 
    if($bits <= 0){ 
        return $x; 
    } 
    if($bits >= 32){ 
        return 0; 
    } 
 
    $bin = decbin($x); 
    $l = strlen($bin); 
 
    if($l > 32){ 
        $bin = substr($bin, $l - 32, 32); 
    }elseif($l < 32){ 
        $bin = str_pad($bin, 32, '0', STR_PAD_LEFT); 
    } 
 
    return bindec(str_pad(substr($bin, 0, 32 - $bits), 32, '0', STR_PAD_LEFT)); 
}         
 
function charCodeAt($str, $index) 
{ 
    $char = mb_substr($str, $index, 1, 'UTF-8'); 
  
    if (mb_check_encoding($char, 'UTF-8')) 
    { 
        $ret = mb_convert_encoding($char, 'UTF-32BE', 'UTF-8'); 
        return hexdec(bin2hex($ret)); 
    } 
    else 
    { 
        return null; 
    } 
} 
 
function mb_str_split($str, $length = 1)  
{ 
    if ($length < 1) return false; 
    $result = array(); 
    for ($i = 0; $i < mb_strlen($str); $i += $length) { 
        $result[] = mb_substr($str, $i, $length); 
    } 
    return $result; 
} 
             
function RL($a, $b) 
{ 
    for($c = 0; $c < strlen($b) - 2; $c +=3) { 
        $d = $b{$c+2}; 
        $d = $d >= 'a' ? charCodeAt($d,0) - 87 : intval($d); 
        $d = $b{$c+1} == '+' ? shr32($a, $d) : $a << $d; 
        $a = $b{$c} == '+' ? ($a + $d & 4294967295) : $a ^ $d; 
    } 
    return $a; 
} 
 
function TKK()  
{ 
    $a = 561666268; 
    $b = 1526272306; 
    return 406398 . '.' . ($a + $b); 
} 
 
function TL($a)  
{ 
    $tkk = explode('.', TKK()); 
    $b = $tkk[0]; 
 
    for($d = array(), $e = 0, $f = 0; $f < mb_strlen ( $a, 'UTF-8' ); $f ++) { 
        $g = charCodeAt ( $a, $f ); 
        if (128 > $g) { 
            $d [$e ++] = $g; 
        } else { 
            if (2048 > $g) { 
                $d [$e ++] = $g >> 6 | 192; 
            } else { 
                if (55296 == ($g & 64512) && $f + 1 < mb_strlen ( $a, 'UTF-8' ) && 56320 == (charCodeAt ( $a, $f + 1 ) & 64512)) { 
                    $g = 65536 + (($g & 1023) << 10) + (charCodeAt ( $a, ++ $f ) & 1023); 
                    $d [$e ++] = $g >> 18 | 240; 
                    $d [$e ++] = $g >> 12 & 63 | 128; 
                } else { 
                    $d [$e ++] = $g >> 12 | 224; 
                    $d [$e ++] = $g >> 6 & 63 | 128; 
                } 
            } 
            $d [$e ++] = $g & 63 | 128; 
        } 
    } 
    $a = $b; 
    for($e = 0; $e < count ( $d ); $e ++) { 
        $a += $d [$e]; 
        $a = RL ( $a, '+-a^+6' ); 
    } 
    $a = RL ( $a, "+-3^+b+-f" ); 
    $a ^= $tkk[1]; 
    if (0 > $a) { 
        $a = ($a & 2147483647) + 2147483648; 
    } 
    $a = fmod ( $a, pow ( 10, 6 ) ); 
    return $a . "." . ($a ^ $b); 
} 
 
    $r = TL("test");
на C#:
private static string TKK() 
    { 
    	long a = 561666268; 
    	long b = 1526272306; 
    	return "406398." + (a + b); 
    } 
     
     
    private int charCodeAt(string str, int index) 
    { 
    	string chr = "" + str[index]; 
    	byte[] bytes = Encoding.GetEncoding(12001).GetBytes(chr); 
    	chr = Encoding.GetEncoding(12001).GetString(bytes); 
     
    	return (int)chr[0]; 
    } 
     
    private string str_pad(string to, int n, string what) 
    { 
    	for (var i = to.Length; to.Length < n; i++) 
    		to = what + to; 
    	return to; 
    } 
     
    private long shr32(long x, int bits) 
    { 
    	if (bits <= 0) 
    	{ 
    		return x; 
    	} 
    	if (bits >= 32) 
    	{ 
    		return 0; 
    	} 
     
    	var bin = Convert.ToString(x, 2); 
    	var l = bin.Length; 
     
    	if (l > 32) 
    	{ 
    		bin = bin.Substring(l - 32, 32); 
    	} 
    	else if(l < 32) 
    	{ 
    		bin = str_pad(bin, 32, "0"); 
    	} 
     
    	return Convert.ToInt64(str_pad(bin.Substring(0, 32 - bits), 32, "0"), 2); 
    } 
     
    private string RL(string a, string b) 
    { 
    	for (var c = 0; c < b.Length - 2; c += 3) 
    	{ 
    		long d = b[c + 2]; 
    		d = (d >= 'a' ? charCodeAt(d+"", 0) - 87 : Convert.ToInt32(d)); 
    		d = (b[c + 1] == '+' ? shr32(Convert.ToInt64(a), Convert.ToInt32(d)) : Convert.ToInt64(a) << Convert.ToInt32(d)); 
    		a = Convert.ToString(b[c] == '+' ? (Convert.ToInt64(a) + Convert.ToInt64(d) & 4294967295) : Convert.ToInt64(a) ^ Convert.ToInt64(d)); 
    	} 
    	return a; 
    } 
     
    private string TL(string a) 
    { 
    	var tkk = TKK().Split('.'); 
    	var b = tkk[0]; 
     
    	int[] d = new int[1]; 
    	var e = 0; 
    	for (var f = 0; f < a.Length; f++) 
    	{ 
    		var g = charCodeAt( a, f); 
    		if (128 > g) 
    		{ 
    			if (e == d.Length) 
    				Array.Resize(ref d, d.Length + 1); 
    			d[e++] = g; 
    		} 
    		else 
    		{ 
    			if (2048 > g)  
    			{ 
    				if (e == d.Length) 
    					Array.Resize(ref d, d.Length + 1); 
    				d[e++] = g >> 6 | 192; 
    			} 
    			else 
    			{ 
    				if (55296 == (g & 64512) && f + 1 < a.Length && 56320 == (charCodeAt( a, f + 1) & 64512))  
    				{ 
    					g = 65536 + ((g & 1023) << 10) +(charCodeAt( a, ++f) & 1023); 
    					if (e == d.Length) 
    						Array.Resize(ref d, d.Length + 1); 
    					d[e++] = g >> 18 | 240; 
    					d[e++] = g >> 12 & 63 | 128; 
    				}  
    				else 
    				{ 
    					if (e == d.Length) 
    						Array.Resize(ref d, d.Length + 1); 
    					d[e++] = g >> 12 | 224; 
    					d[e++] = g >> 6 & 63 | 128; 
    				} 
    			} 
    			if (e == d.Length) 
    				Array.Resize(ref d, d.Length + 1); 
    			d[e++] = g & 63 | 128; 
    		} 
    	} 
    	a = b; 
    	for (e = 0; e < d.Length; e++) 
    	{ 
    		a += d[e]; 
    		a = RL( a, "+-a^+6"); 
    	} 
    	a = RL( a, "+-3^+b+-f"); 
    	a = Convert.ToString(Convert.ToInt64(a) ^ Convert.ToInt64(tkk[1])); 
    	if (0 > Convert.ToInt64(a))  
    	{ 
    		a = Convert.ToString((Convert.ToInt64(a) & 2147483647) +2147483648); 
    	} 
    	a = Convert.ToString(Convert.ToInt64(a) % Math.Pow(10, 6)); 
    	return a+"."+(Convert.ToInt64(a) ^ Convert.ToInt64(b)); 
    }
php плохо знаю, но там работает все отлично.Перевел на C# - выводит всегда "938574.549168" при любом тексте... Помогите найти ошибку, где пошло не так.

READ ALSO
Не подключается класс Application

Не подключается класс Application

В классе установщике хочу считать из ресурсов файл и записать его на диск, но класс Application не подключается, хотя я даже библиотеку подсоединял...

244
Передача get данных в Angular 4+

Передача get данных в Angular 4+

Привет, столкнулся с такой проблемойЕсть API на asp

311
как считывать данные с пдф файла ? [требует правки]

как считывать данные с пдф файла ? [требует правки]

с pypdf делаю конвертацию например на тхтЯ хочу вытаскивать по тегам данные с шаблонного пдф

218
Подключение crystalreport к солюшену

Подключение crystalreport к солюшену

ЗдравствуйтеВ проекте используется crystalreport

275