Преобразование PHP-функции в C #

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

Я уже преобразовал это, чтобы соответствовать правильному результату: —

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) на наборы из 2 символов.
Затем он преобразует эти шестнадцатеричные строки в десятичные числа, прежде чем получить значение chr () этого числа.
Хранение всех этих преобразований в строке $ return.
Наконец это делает преобразование base 64.

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

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);
}
1

Другие решения

Вы можете сделать это, используя две удивительные технологии .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

Нет необходимости разбивать каждый шестнадцатеричный байт на два символа или проходить по каждой паре символов.

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

Как преобразовать числа между шестнадцатеричным и десятичным в C #?

Как я могу преобразовать шестнадцатеричную строку в байтовый массив?

Я бы сделал что-то подобное

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);
}
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
По вопросам рекламы [email protected]