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#的兄弟帮忙改写一下!感激不尽!
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#的兄弟帮忙改写一下!感激不尽!
test(0) = Not test(0)
test(1) = Not test(1)这样我编译成DLL文件放在c#程序里也可以用多谢了
直接用做成VB做成dll,当然在net用平台调用,互操作。
要不你帮我编译一个dll??我直接引用
要不你帮我编译一个dll??我直接引用
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");
}
}
}
}
包头 标识 包长 流水号 地址 命令 参数 校验 包尾
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#,那么大家能按这个例子推出逻辑算法非常感谢了!!!
http://zhidao.baidu.com/question/311840124.html
或者把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";
}
}