2014-11-19 1 views
1

Я почти закончил преобразование PHP-скрипта в C#-один для использования в ASP.net.Преобразование PHP-функции в C#

Я уже конвертированы это, чтобы соответствовать правильный результат до сих пор: -

function sign_url($url, $key, $secret) 
{ 
    if (strpos($url,'?') !== false) 
    { 
     $url .= "&"; 
    } 
    else 
    { 
     $url .= "?"; 
    } 
    $url .= "ApplicationKey=" . $key; 

    $signature = hash_hmac("sha1", urldecode($url), $secret); 
    $url .= "&Signature=" . hex_to_base64($signature); 

    return $url; 
} 

Вот часть я борюсь с: -

function hex_to_base64($hex){ 
    $return = ''; 
    foreach(str_split($hex, 2) as $pair){ 
    $return .= chr(hexdec($pair)); 
    } 
    return base64_encode($return); 
} 

Из того, что я могу собрать он разбивает входную строку ($ hex) на наборы из двух символов.
Затем он преобразует эти шестнадцатеричные строки в десятичные числа перед получением значения chr() этого числа.
Хранение всех этих преобразований в строке $ return.
Наконец, это преобразование базы 64.

Я изо всех сил стараюсь найти лучший способ сделать это на C#, в частности, расщепление на 2 символа при выполнении других преобразований.

+0

'до получения Chr()', что именно в том, что должен делать? Насколько я понимаю, вам нужно проанализировать две строки символов как шестнадцатеричное число, а затем получить эквивалент 'char'. Это верно? –

+0

Теперь я добавил первую часть кода для ясности. Из того, что я могу собрать, вы правы. Он проходит в строке, такой как «B709E79EA2769A409FF87FE87AC1F6799EE0917E» – Porkster

+0

Возможно, вы захотите взглянуть на: http://csharpfunctions.blogspot.co.uk/2010/03/convert-hex-formatted-string-to-base64.html и/или http://stackoverflow.com/questions/7784345/conversion-between-base64string-and-hexadecimal – Jamiec

ответ

1

Старый, хороший, код C-стиле, которые не используют LINQ и мегабайты других библиотек:

static string HexToBase64(string hex) 
{ 
    byte[] buf = new byte[hex.Length/2]; 
    for (int i = 0; i < hex.Length/2; i++) 
    { 
     buf[i] = Convert.ToByte(hex.Substring(i*2,2), 16); 
    } 
    return Convert.ToBase64String(buf); 
} 
+0

Блестящий. Это сработало отлично. Спасибо за помощь. – Porkster

0

Попробуйте эти:

str_split = String.Split() (http://msdn.microsoft.com/en-us/library/system.string.split(v=vs.110).aspx) 

base64_encode = Convert.ToBase64String() (http://msdn.microsoft.com/en-us/library/system.convert.tobase64string(v=vs.110).aspx) 

chr = Convert.ToChar() (http://msdn.microsoft.com/en-us/library/system.convert.tochar(v=vs.110).aspx) 

hexdec = .ToString("X") (http://msdn.microsoft.com/en-us/library/8wch342y(v=vs.110).aspx) 

hash_hmac = SHA1.ComputeHash() (http://msdn.microsoft.com/en-us/library/s02tk69a(v=vs.110).aspx) 
0

Вы можете сделать это с помощью двух удивительных .Net технологий - LINQ и Rx:

private static string HexStringToBase64String(string hexString) 
{ 
    var byteArray = hexString 
     .ToObservable() 
     .Buffer(2) 
     .Select(pair => new string(pair.ToArray())) 
     .Select(numberString => Byte.Parse(numberString, NumberStyles.HexNumber)) 
     .ToEnumerable() 
     .ToArray(); 

    return Convert.ToBase64String(byteArray); 
} 
+0

Спасибо за это, он помог мне найти правильный результат. – Porkster

0

Там нет необходимости разделять каждый шестигранный байт в два символа, или цикл по каждому символу пара в этом отношении.

Взгляните на следующие вопросы:

How to convert numbers between hexadecimal and decimal in C#?

How can I convert a hex string to a byte array?

Я бы сделать что-то вроде этого

public static string HexToBase64String(string hex) 
{ 
    if (string.IsNullOrEmpty(hex) || hex.Length % 2 == 1) 
     throw new ArgumentException("Invalid hex value", "hex"); 

    var bytes = Enumerable.Range(0, hex.Length) 
        .Where(x => x % 2 == 0) 
        .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) 
        .ToArray(); 
    return System.Convert.ToBase64String(bytes); 
}