//例如:求三个字节0xAA 0xAA 0xAA(16进制)的CRC校验码
//字符指针ptr指向此串,count是指针ptr的长度,此时为3,
//求得的CRC校验码是0x9C 0x48
int calcrc( char *ptr, int count ) //求CRC的calcrc函数,ptr是指向字符数组的指针
{ //count是待求CRC校验码的字节数
int i;
unsigned int crc; //要返回的CRC,16位的
unsigned char crc1,crc2,crc3; //指向数组中连续的三个字符(byte),8位的
ptr[count] = 0x00; //计算CRC串的末尾添加两个字节的0x00
ptr[count+1] = 0x00;
crc1 = *ptr++ ;
crc2 = *ptr++ ;
while (--count >= 0) {
crc3 = *ptr++ ; //在while中补充下一个字符(8个bit)
for (i = 0; i < 8; ++i)
{
if (crc1 & 0x80) //判断crc1高位是否为1
{
crc1 = crc1 << 1; //移出高位
if(crc2 & 0x80) //判断crc2高位是否为1
{
crc1=crc1 | 0x01; //crc1低位由0变1
}
crc2 = crc2 << 1; //crc2移出高位
if(crc3 & 0x80) //判断crc3高位是否为1
{
crc2=crc2 | 0x01; //crc2低位由0变1
}
crc3=crc3<<1; //crc3移出高位
crc1=crc1 ^ 0x10; //前8bit与0x10异或
crc2=crc2 ^ 0x21; //后8bit与0x21异或
}
else //如果crc1高位不为1,只移位不做异或
{
crc1 = crc1 << 1;
if(crc2 & 0x80)
{
crc1=crc1 | 0x01;
}
crc2 = crc2 << 1;
if(crc3 & 0x80)
{
crc2=crc2 | 0x01;
}
crc3=crc3<<1;
}
}//for
}//while
crc=(crc1<<8)+crc2; //返回的16位的crc校验码
return (crc);
}//calcrc
可以发至邮箱:duxiaomin@qq.com,,,感谢感谢!!!
17 个解决方案
#1
纯运算的代码,肯定能从C“翻译”成VB代码啊。
#2
能帮我“翻译”一下么,本人对C不懂
#3
那段代码,不就是一些简单的位运算吗,
就算不懂C,你要是有编程基础,直接找相关的知识点来看,也要不了20分钟就搞懂了。
我现在没心情当免费劳工……
就算不懂C,你要是有编程基础,直接找相关的知识点来看,也要不了20分钟就搞懂了。
我现在没心情当免费劳工……
#4
用 VC++写成一个 DLL 库,给 VB 调用。
#5
有高手会么,搞出来能用的话发个红包意思意思也行的。
#6
CRC16或者CRC32的,网上一搜遍地都是代码。
问度娘:VB6 CRC
问度娘:VB6 CRC
#7
网上的都是标准的,我这个可能不是标准的CRC校验
#8
少于100红包不干。
#9
你能写出来么,测试好用红包不会小的
#10
有会的可以加我微信:whoareyou5500,备注(CRC),测试通过立马发红包
#11
楼主可以用支付宝么?
把代码“翻译”了一下,做了个dll。
你可以测试一下是否都相符。 不过这个测试版dll对“源数据”限制最多计算15字节。
测试代码:
dll下载链接: https://pan.baidu.com/s/1NCl3AcYQP7wv6U4swYxp-w
密码: n5jr
接口函数是按你的C代码原型写的。
如果在VB6中做,其实可以把“入口参数”改为直接传“源数据”的字节数组。
不过,用“数据首址、数量量”的方式,好处是可以计算一个“字节数组(字节序列)”的其中任意一段数据。
“传数组”的方式,比较适合于“整个数组”的数据计算。
实际应用中,也可以封装成两个接口:
一个“传数组”,用于整个数组的计算;
一个传地址、数据量,用于任意一段数据的计算。
把代码“翻译”了一下,做了个dll。
你可以测试一下是否都相符。 不过这个测试版dll对“源数据”限制最多计算15字节。
测试代码:
Option Explicit
Private Declare Function CRC16 Lib "CRC16.dll" (ByVal lpData As Long, ByVal nCount As Long) As Integer
' 如果在IDE中运行,提示“找不到dll文件”,可把dll文件写成“完整路径”。
Private Sub Command1_Click()
Dim arrData() As Byte
Dim strText As String
Dim i&, w As Long
strText = Text1.Text
w = Len(strText)
If (0 = w) Then Exit Sub
w = w \ 2&
ReDim arrData(w)
For i = 0& To w - 1&
arrData(i) = Val("&H" & Mid$(strText, 1& + i + i, 2&))
Next
Me.Cls
Me.Print "CRC16 = 0x" & Hex$(CRC16(VarPtr(arrData(0&)), w))
End Sub
Private Sub Form_Load()
Text1.Text = "AAAAAA"
' 注意:必须是“两位16进制”表示1个字节
' 比如,字节值为1, 必须对应输入"01"
End Sub
dll下载链接: https://pan.baidu.com/s/1NCl3AcYQP7wv6U4swYxp-w
密码: n5jr
接口函数是按你的C代码原型写的。
如果在VB6中做,其实可以把“入口参数”改为直接传“源数据”的字节数组。
不过,用“数据首址、数量量”的方式,好处是可以计算一个“字节数组(字节序列)”的其中任意一段数据。
“传数组”的方式,比较适合于“整个数组”的数据计算。
实际应用中,也可以封装成两个接口:
一个“传数组”,用于整个数组的计算;
一个传地址、数据量,用于任意一段数据的计算。
#12
单看这个代码觉得挺废的
注释里面都写了//如果crc1高位不为1,只移位不做异或,结果在条件判断的两个分支里分别写了一遍完全相同移位,还真是一个分支做异或另一个不做。
此外,crc1,crc2,crc3 注释中写了 指向数组中连续的三个字符。但代码中 crc1 和 crc2在一开始去了数组头两个字符,后面的循环里,只有CRC3逐个取值下去,crc1和crc2都不再取数组里面的东西了。
注释里面都写了//如果crc1高位不为1,只移位不做异或,结果在条件判断的两个分支里分别写了一遍完全相同移位,还真是一个分支做异或另一个不做。
此外,crc1,crc2,crc3 注释中写了 指向数组中连续的三个字符。但代码中 crc1 和 crc2在一开始去了数组头两个字符,后面的循环里,只有CRC3逐个取值下去,crc1和crc2都不再取数组里面的东西了。
#13
别人的“算法”就是那样,你咬他啊……
虽然“crc1和crc2都不再取数组里面的东西了”,并不代表它不变呀……
crc3会对它俩“造成影响”的。
虽然“crc1和crc2都不再取数组里面的东西了”,并不代表它不变呀……
crc3会对它俩“造成影响”的。
#14
暂时不需要了,谢谢大家!!!
#15
#16
#17
还上个鬼啊 !
楼主一句“不需要了”,什么功夫都白费…………
#1
纯运算的代码,肯定能从C“翻译”成VB代码啊。
#2
能帮我“翻译”一下么,本人对C不懂
#3
那段代码,不就是一些简单的位运算吗,
就算不懂C,你要是有编程基础,直接找相关的知识点来看,也要不了20分钟就搞懂了。
我现在没心情当免费劳工……
就算不懂C,你要是有编程基础,直接找相关的知识点来看,也要不了20分钟就搞懂了。
我现在没心情当免费劳工……
#4
用 VC++写成一个 DLL 库,给 VB 调用。
#5
有高手会么,搞出来能用的话发个红包意思意思也行的。
#6
CRC16或者CRC32的,网上一搜遍地都是代码。
问度娘:VB6 CRC
问度娘:VB6 CRC
#7
网上的都是标准的,我这个可能不是标准的CRC校验
#8
少于100红包不干。
#9
你能写出来么,测试好用红包不会小的
#10
有会的可以加我微信:whoareyou5500,备注(CRC),测试通过立马发红包
#11
楼主可以用支付宝么?
把代码“翻译”了一下,做了个dll。
你可以测试一下是否都相符。 不过这个测试版dll对“源数据”限制最多计算15字节。
测试代码:
dll下载链接: https://pan.baidu.com/s/1NCl3AcYQP7wv6U4swYxp-w
密码: n5jr
接口函数是按你的C代码原型写的。
如果在VB6中做,其实可以把“入口参数”改为直接传“源数据”的字节数组。
不过,用“数据首址、数量量”的方式,好处是可以计算一个“字节数组(字节序列)”的其中任意一段数据。
“传数组”的方式,比较适合于“整个数组”的数据计算。
实际应用中,也可以封装成两个接口:
一个“传数组”,用于整个数组的计算;
一个传地址、数据量,用于任意一段数据的计算。
把代码“翻译”了一下,做了个dll。
你可以测试一下是否都相符。 不过这个测试版dll对“源数据”限制最多计算15字节。
测试代码:
Option Explicit
Private Declare Function CRC16 Lib "CRC16.dll" (ByVal lpData As Long, ByVal nCount As Long) As Integer
' 如果在IDE中运行,提示“找不到dll文件”,可把dll文件写成“完整路径”。
Private Sub Command1_Click()
Dim arrData() As Byte
Dim strText As String
Dim i&, w As Long
strText = Text1.Text
w = Len(strText)
If (0 = w) Then Exit Sub
w = w \ 2&
ReDim arrData(w)
For i = 0& To w - 1&
arrData(i) = Val("&H" & Mid$(strText, 1& + i + i, 2&))
Next
Me.Cls
Me.Print "CRC16 = 0x" & Hex$(CRC16(VarPtr(arrData(0&)), w))
End Sub
Private Sub Form_Load()
Text1.Text = "AAAAAA"
' 注意:必须是“两位16进制”表示1个字节
' 比如,字节值为1, 必须对应输入"01"
End Sub
dll下载链接: https://pan.baidu.com/s/1NCl3AcYQP7wv6U4swYxp-w
密码: n5jr
接口函数是按你的C代码原型写的。
如果在VB6中做,其实可以把“入口参数”改为直接传“源数据”的字节数组。
不过,用“数据首址、数量量”的方式,好处是可以计算一个“字节数组(字节序列)”的其中任意一段数据。
“传数组”的方式,比较适合于“整个数组”的数据计算。
实际应用中,也可以封装成两个接口:
一个“传数组”,用于整个数组的计算;
一个传地址、数据量,用于任意一段数据的计算。
#12
单看这个代码觉得挺废的
注释里面都写了//如果crc1高位不为1,只移位不做异或,结果在条件判断的两个分支里分别写了一遍完全相同移位,还真是一个分支做异或另一个不做。
此外,crc1,crc2,crc3 注释中写了 指向数组中连续的三个字符。但代码中 crc1 和 crc2在一开始去了数组头两个字符,后面的循环里,只有CRC3逐个取值下去,crc1和crc2都不再取数组里面的东西了。
注释里面都写了//如果crc1高位不为1,只移位不做异或,结果在条件判断的两个分支里分别写了一遍完全相同移位,还真是一个分支做异或另一个不做。
此外,crc1,crc2,crc3 注释中写了 指向数组中连续的三个字符。但代码中 crc1 和 crc2在一开始去了数组头两个字符,后面的循环里,只有CRC3逐个取值下去,crc1和crc2都不再取数组里面的东西了。
#13
别人的“算法”就是那样,你咬他啊……
虽然“crc1和crc2都不再取数组里面的东西了”,并不代表它不变呀……
crc3会对它俩“造成影响”的。
虽然“crc1和crc2都不再取数组里面的东西了”,并不代表它不变呀……
crc3会对它俩“造成影响”的。
#14
暂时不需要了,谢谢大家!!!
#15
#16
#17
还上个鬼啊 !
楼主一句“不需要了”,什么功夫都白费…………