遗留的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

遗留的vbscript到c#equivalent

我真的希望你有一两个参考资料可以测试,但这是我能想出的最好的

    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运算符。SinCos现在是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的简单强制转换。