Public Function GetVerify(tpStr As String) As String
Dim i As Integer
Dim stpStr As String
Dim tpInt As Integer
Dim tpSendArr() As Byte
On Error GoTo Err1tpInt = 0
tpSendArr() = StrConv(tpStr, vbFromUnicode)For i = 0 To UBound(tpSendArr)
    tpInt = tpInt + tpSendArr(i)
Next iDim test(1) As ByteCopyMemory test(0), tpInt, 2
test(0) = Not test(0)
test(1) = Not test(1)If Len(CStr(Hex(test(1)))) = 1 Then
stpStr = "0" & CStr(Hex(test(1)))
Else
stpStr = CStr(Hex(test(1)))
End IfIf Len(CStr(Hex(test(0)))) = 1 Then
stpStr = stpStr & "0" & CStr(Hex(test(0)))
Else
stpStr = stpStr & CStr(Hex(test(0)))
End IfGetVerify = stpStrExit Function
Err1:
GetVerify = "0000"
End Function这是一个对字符串操作的函数,用途是传入一串字符串,经过系列逻辑处理,得到有效的4位校验码。此函数本是公司LED发布系统里的一个校验逻辑函数,由于之前是纯VB代码写的,现在要改写成C#程序,苦于之前的协议逻辑文档丢失,又本人不懂VB,所以才十万火急请各位帮忙!希望能有懂VB又通晓C#的兄弟帮忙改写一下!感激不尽!

解决方案 »

  1.   

    各位大侠,快快帮手一把啊实在不行给转成VB.NET也可以,转VB。NET貌似只需改tpSendArr() = StrConv(tpStr, vbFromUnicode)CopyMemory test(0), tpInt, 2
    test(0) = Not test(0)
    test(1) = Not test(1)这样我编译成DLL文件放在c#程序里也可以用多谢了
      

  2.   

    下个动软.net代码生成器,里边有vb转C#,C#转VB的功能,本人使用过
      

  3.   

    给你建议:
    直接用做成VB做成dll,当然在net用平台调用,互操作。
      

  4.   

    我这里没装VB呢
    要不你帮我编译一个dll??我直接引用
      

  5.   

    我这里没装VB呢
    要不你帮我编译一个dll??我直接引用
      

  6.   

    StrConv貌似是VB6的函数吧,不太清楚其用途,估计是按Unicode把字符串打散成字节吧。在下按上面的猜测写出的代码如下:using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;namespace ConTest5
    {
        class Program
        {
            [DllImport("kernel32.dll")]
            static extern void RtlMoveMemory(byte[] dest, ref int src, int len);        static void Main(string[] args)
            {
                Console.WriteLine(GetVerify("abcde"));
            }        public static string GetVerify(string tpStr)
            {
                string stpStr = "";
                int tpInt;
                byte[] tpSendArr;            try
                {
                    tpInt = 0;
                    tpSendArr = Encoding.Unicode.GetBytes(tpStr);                for (int i = 0; i < tpSendArr.Length; i++)
                        tpInt += tpSendArr[i];                byte[] test = new byte[2];                RtlMoveMemory(test, ref tpInt, 2);                foreach (byte b in test)
                        stpStr += string.Format("{0:x2}", b);                return (stpStr);
                }
                catch
                {
                    return ("0000");
                }
            }
        }
    }
      

  7.   

    "我这里没装VB呢要不你帮我编译一个dll??我直接引用"楼主,这样不好吧,你没有装,很容易下载嘛,做事情啊不能大依赖别人啊。
      

  8.   

    一个很好的工具,百度一下 VB ConvertTo C# 把你的代码复制进去 Convert 一下就好了
      

  9.   

    现在贴出算法逻辑:
    包头 标识 包长 流水号 地址 命令 参数 校验 包尾
    0x0a $& LLLL KKKK AA C SSSS 0x0d2.1、包头(0x0a)、包尾(0x0d): 指数据的帧边界,各占用长度1字节
    2.2、标识($&):指表示为带校验和的指令格式
    2.3、包长(LLLL)、校验和(SSSS):包长即为信息长度指示为“LLLL”和校验“SSSS”分别为四个字节的数据。这四个字节数据是用16进制表示的,即每个字节的范围为’0’-’F’,如长度为20个字节的信息,十六进制为0x0014,则应表示为 : “0014”(字符串) ,如果校验和为45,十六进制为0x002D则应表示为:“002D” (字符串)。注意字符串中的“ABCDEF”应用大写字母,不可以用小写来表示。信息长度“LLLL”是指其后和校验和“SSSS”之前的所有命令及信息的节字数,不包括“LLLL”自身和校验和“SSSS”。校验和“SSSS”为其前的从信息长度“LLLL”开始所有的字节的代数和取两个字节,溢出部分省略。然后取反码后再变换用ASCII表示的四个ASC码。下面举例说明校验格式下长度指示与校验和的计算方式。如清除所有寻呼屏的信息,并将自由存贮空间设置为“0”,则校验格式发送的信息如下:$&000A0001234500FD9F以上“000A”表示其后除校验和之外的信息的字节数为10个,10表示为16进制数后为“000A”。最后四个字节为校验和。这里手工计算比较麻烦,因为是根据信息的ASCII码进行计算的,汉字是根据其内码进行计算的,如“0”的ASCII码值为0x30,“A”的ASCII码为0x41。用这种方式将从长度指示开始所有字节相加后为:0x0260,将其取反后为:0xFD9F。 我按此例子中的 $&000A0001234500FD9F 算不出例子中所说的:“用这种方式将从长度指示开始所有字节相加后为:0x0260”。 不知道是不是我理解错了,要是不能将VB函数转C#,那么大家能按这个例子推出逻辑算法非常感谢了!!!
      

  10.   

    LZ我有动软编译器  可以用这个 加我Q 我发给你453367672
      

  11.   

    我在百度也提了这个问题,悬赏150财富值,有百度知道账号的帮忙回答,满意再加分。
    http://zhidao.baidu.com/question/311840124.html
      

  12.   

    我推荐你使用Reflector将编译好的程序再逆向回来,你可以选择逆向的语言。
      

  13.   

    以后你可以现在VB里面跑看执行的结果是怎样的然后再C#里面。
    或者把VB转换成VB.NET然后再转换C#
    你百度那的正确答案
    照着VB6的代码写的,运行结果和VB6的代码一致,但是和那个文档描述的不一样
    那个文档说只算从LLLL到SSSS之前的数据,也就是前面的$&和后面的FD9F不要
    VB6的代码里没有处理这个,应该在调用这个方法之前还有其他处理吧
    就算在输入中把这两部分去掉,加起来还是得不到0x0260      public string GetVerify(string tpStr)
            {
                try
                {
                    string stpStr;
                    int tpInt = 0;
                    byte[] tpSendArr = Encoding.Default.GetBytes(tpStr);
                    for (int i = 0; i <= tpSendArr.GetUpperBound(0); i++)
                    {
                        tpInt += tpSendArr[i];
                    }                byte[] test = BitConverter.GetBytes(tpInt);
                    test[0] = (byte)~test[0];
                    test[1] = (byte)~test[1];                string strTmp;
                    strTmp = test[1].ToString("X");
                    if (strTmp.Length == 1) strTmp = "0" + strTmp;
                    stpStr = strTmp;                strTmp = test[0].ToString("X");
                    if (strTmp.Length == 1) strTmp = "0" + strTmp;
                    stpStr = stpStr + strTmp;                return stpStr;
                }
                catch (Exception)
                {
                    return "0000";
                }
            }