我几乎已经完成了将PHP脚本转换为在ASP.net中使用的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)拆分为2个字符的集合
然后在获取此数字的chr()值之前,将这些十六进制字符串转换为十进制数字
将所有这些转换存储在$ return字符串中
最后它进行了base 64转换。
我很难在C#中找到最好的方法,特别是在进行其他转换时分成2个字符。
答案 0 :(得分: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 :(得分: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)
答案 2 :(得分: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);
}
答案 3 :(得分: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);
}