遗留的vbscript到c#equivalent
本文关键字:c#equivalent vbscript | 更新日期: 2023-09-27 18:30:07
我在一个经典的asp网站中继承了一个旧的哈希算法,我正在将其转换为asp.net(现阶段为2.0)。
就我的一生而言,我无法理解旧函数,从而能够用C#编写匹配的代码。我相信这真的很简单,但我现在看不到树林。
这是原始的经典asp代码,它需要一个字符串,任何关于等价C#代码的帮助都将不胜感激:
Function PHash( pValue )
Dim dValue
Dim dAccumulator
Dim lTemp
Dim sValue
sValue = UCase(Trim("" & pValue))
dAccumulator = 0
For lTemp = 1 to Len(sValue)
dValue = Asc(Mid(sValue, lTemp, 1))
If (lTemp AND 1) = 1 Then
dAccumulator = Sin( dAccumulator + dValue )
Else
dAccumulator = Cos( dAccumulator + dValue )
End If
Next
dAccumulator = dAccumulator * CLng(10 ^ 9)
PHash = CLng(dAccumulator)
End Function
我真的希望你有一两个参考资料可以测试,但这是我能想出的最好的
private static long PHash(String pValue)
{
double dAccumulator = 0;
byte[] asciiBytes = Encoding.ASCII.GetBytes(pValue.Trim().ToUpper());
for (int i = 0; i < asciiBytes.Length; i++)
{
if ((i & 1) == 1)
dAccumulator = Math.Cos(dAccumulator + (double)asciiBytes[i]);
else
dAccumulator = Math.Sin(dAccumulator + (double)asciiBytes[i]);
}
dAccumulator = dAccumulator * Math.Pow(10,9);
return (long)dAccumulator;
}
没有理由直接翻译,因为这涉及到很多浪费。我用一个字节数组的转换替换了所有的字符串解析逻辑,然后用for循环迭代。我们在VB中使用了&
运算符来复制AND运算符。Sin
和Cos
现在是Math
类的方法,可以通过链接方法Trim()
和ToUpper()
来修剪字符串并将其转换为大写。.NET中没有指数运算符,因此Math.Pow()
是它的替代。注意,我们将所有内容都保持为双精度,直到返回行,在返回行中,我们将值作为long
返回
您可以使用此代码。请参阅转换工具:http://www.developerfusion.com/tools/convert/vb-to-csharp/?batchId=dbded81a-54c9-4df5-醛-4db45773c842
public object PHash(pValue)
{
dynamic dValue = null;
dynamic dAccumulator = null;
dynamic lTemp = null;
dynamic sValue = null;
sValue = Strings.UCase(Strings.Trim("" + pValue));
dAccumulator = 0;
for (lTemp = 1; lTemp <= Strings.Len(sValue); lTemp++) {
dValue = Strings.Asc(Strings.Mid(sValue, lTemp, 1));
if ((lTemp & 1) == 1) {
dAccumulator = Sin(dAccumulator + dValue);
} else {
dAccumulator = Cos(dAccumulator + dValue);
}
}
dAccumulator = dAccumulator * Convert.ToInt64(Math.Pow(10, 9));
return Convert.ToInt64(dAccumulator);
}
翻译可以是这样的:
public long PHash (string pValue)
{
int dValue;
double dAccumulator;
int lTemp;
string sValue;
sValue = pValue.Trim().ToUpper();
dAccumulator = 0;
for (lTemp = 1; lTemp <= sValue.Length; lTemp ++)
{
dValue = (int)char.Parse(sValue.Substring(lTemp, 1));
if ((lTemp % 1) == 1)
{
dAccumulator = Math.Sin(dAccumulator + dValue);
}
else
{
dAccumulator = Math.Cos(dAccumulator + dValue);
}
}
dAccumulator = dAccumulator * (long)(10 ^ 9);
return (long)(dAccumulator);
}
翻译的函数为:修剪:删除字符串左侧和右侧的空格。在C#中:Trim()。UCase:将指定的字符串转换为大写。在C#中:ToUpper()。Mid:从字符串中返回指定数量的字符。在C#中:Substring()。Len:返回字符串中的字符数。在C#中:长度。CLng:是对long类型的简单转换。Asc:解析为从char到int的简单强制转换。