有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C

时间:2022-08-27 00:22:54
16位CRC校验码的C源程序
//例如:求三个字节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代码啊。

有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C

#2


引用 1 楼 Chen8013 的回复:
纯运算的代码,肯定能从C“翻译”成VB代码啊。

有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C



能帮我“翻译”一下么,本人对C不懂

#3


那段代码,不就是一些简单的位运算吗,
就算不懂C,你要是有编程基础,直接找相关的知识点来看,也要不了20分钟就搞懂了。

我现在没心情当免费劳工……

#4


用 VC++写成一个 DLL 库,给 VB 调用。

#5


有高手会么,搞出来能用的话发个红包意思意思也行的。

#6


CRC16或者CRC32的,网上一搜遍地都是代码。
问度娘:VB6 CRC

#7


网上的都是标准的,我这个可能不是标准的CRC校验

#8


少于100红包不干。 有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C

#9


你能写出来么,测试好用红包不会小的

#10


有会的可以加我微信:whoareyou5500,备注(CRC),测试通过立马发红包

#11


楼主可以用支付宝么?  有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C

把代码“翻译”了一下,做了个dll。
你可以测试一下是否都相符。 不过这个测试版dll对“源数据”限制最多计算15字节。
有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C

测试代码:
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都不再取数组里面的东西了。

#13


别人的“算法”就是那样,你咬他啊……
有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C

虽然“crc1和crc2都不再取数组里面的东西了”,并不代表它不变呀……
crc3会对它俩“造成影响”的。

#14


暂时不需要了,谢谢大家!!!

#15


该回复于2018-04-18 09:33:46被管理员删除

#16


该回复于2018-04-18 09:33:47被管理员删除

#17


引用 15 楼 czq9188 的回复:
这个还真看不懂,有看得懂的上

还上个鬼啊 !
楼主一句“不需要了”,什么功夫都白费…………
有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C

#1


纯运算的代码,肯定能从C“翻译”成VB代码啊。

有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C

#2


引用 1 楼 Chen8013 的回复:
纯运算的代码,肯定能从C“翻译”成VB代码啊。

有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C



能帮我“翻译”一下么,本人对C不懂

#3


那段代码,不就是一些简单的位运算吗,
就算不懂C,你要是有编程基础,直接找相关的知识点来看,也要不了20分钟就搞懂了。

我现在没心情当免费劳工……

#4


用 VC++写成一个 DLL 库,给 VB 调用。

#5


有高手会么,搞出来能用的话发个红包意思意思也行的。

#6


CRC16或者CRC32的,网上一搜遍地都是代码。
问度娘:VB6 CRC

#7


网上的都是标准的,我这个可能不是标准的CRC校验

#8


少于100红包不干。 有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C

#9


你能写出来么,测试好用红包不会小的

#10


有会的可以加我微信:whoareyou5500,备注(CRC),测试通过立马发红包

#11


楼主可以用支付宝么?  有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C

把代码“翻译”了一下,做了个dll。
你可以测试一下是否都相符。 不过这个测试版dll对“源数据”限制最多计算15字节。
有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C

测试代码:
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都不再取数组里面的东西了。

#13


别人的“算法”就是那样,你咬他啊……
有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C

虽然“crc1和crc2都不再取数组里面的东西了”,并不代表它不变呀……
crc3会对它俩“造成影响”的。

#14


暂时不需要了,谢谢大家!!!

#15


该回复于2018-04-18 09:33:46被管理员删除

#16


该回复于2018-04-18 09:33:47被管理员删除

#17


引用 15 楼 czq9188 的回复:
这个还真看不懂,有看得懂的上

还上个鬼啊 !
楼主一句“不需要了”,什么功夫都白费…………
有高手能将这段C的翻译成VB代码么,或者用C做个接口也行,本人不懂C