Question

I need a checksum calculation written in C converted to VB

Asked by: CONTRACTOR4SITE

I have been given some C code which calculates a checksum value for a Hex string. It looks like it could be a CRC-8 checksum, but I'm not positive. I need to create a VB version of this but I'm afraid I don't know C very well and the second function is confusing me. Can anyone help?

unsigned char crc_buff(unsigned char *p, unsigned char I)
{
      unsigned char x;
      unsigned char crc;
            crc = 0xff;
            for ( x = 0; x < I; x++)
                  crc = crc8( crc, *p++);
            return crc;
}
// ---
unsigned char crc8(unsigned char crc; unsigned char data)
{
unsigned char i;
      crc = crc ^ data;
      for (i=0; i<8; i++){
            if (crc & 0x01)
                  crc = (crc >> 1) ^ 0x8C
            else
                  crc >>= 1;
      }      
      return crc;
}

Any help would be appreciated by this newbie.

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2008-04-06 at 14:02:00ID23299987
Topics

Microsoft Visual Basic.Net

,

C Programming Language

,

Miscellaneous Programming

Participating Experts
3
Points
500
Comments
18

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. checksum
    How to find checksum of a file? any windows app is used for that? Can be writed in delphi sucha function?
  2. Checksum program
    Could anyone please provide me with a simple C program (or sources of any)to calculate the checksum over a string(input being a pointer to the string and the length of the string). I have to use it in another program (to manipulate IP datagrams) Thanks
  3. [Qestion][Delphi]CheckSum Problem
    Hi, I am writing a checksum for a device, but I can't find out how he calculate his checksum NO. is there anyway i can find out what kind of CRC he's using ? here is some checksum data helps to calculate. thanks. example: Input String CRC code ---...
  4. CRC 16 Checksum to calculate string input:
    I need a CRC 16 checksum code to calculate string input. "T" = 0xff01, "THE" = 0x23b6, "123456789" = 0xbb3d. Can any help!
  5. Checksum (CRC-16) calculation algorithm
    I am trying to figure out the Checksum alrorithm used by one of the printers I am working with. I have set up a serial communications monitoring interface and was able to record the "conversation" betwee the device and the printer. At the end of the every data line,...
  6. Checksum for cash register packet
    I have problem finding the right checksum for this packet. Checksum is CRC-like type except for the table. This is "Datecs" cash registers and the packet that is sent trough RS-232 from PC. For now, i'm looking for easy solution (not decompiling executive of the pro...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: roshkinsPosted on 2008-04-06 at 14:17:31ID: 21293186

unfortunately, VB.NET does not have any bit manipulation operators. It is impossible. So sorry.

 

by: CONTRACTOR4SITEPosted on 2008-04-06 at 14:57:22ID: 21293288

Hi, thanks for the response. I wondered if there was another way of approaching the problem? I just found the following VB code on the site. This code calculates the CRC-8 checksum which looks pretty close to what I need. Unfortunately I don't understand the original C code enough to be able to figure out what changes I need to make. I know this VB code isn't giving me the right answer but it might be along the right lines?

'---------------------------------------------------------------------------------------
' Procedure : XGetCRC8
' Purpose   : Calculate the CRC8 code for the entire string
'---------------------------------------------------------------------------------------
'
Private Function XGetCRC8(CRC8 As String) As Integer
Dim l_Len As Integer
Dim l_Char As String
Dim l_CRC8 As Integer

    l_CRC8 = 0
    For l_Len = 1 To Len(CRC8)
        l_Char = Mid(CRC8, l_Len, 1)
        l_CRC8 = XCalculateCRC8(l_CRC8, l_Char)
    Next
   
    XGetCRC8 = l_CRC8
End Function

'---------------------------------------------------------------------------------------
' Procedure : XCalculateCRC8
' Purpose   : Calculate the cumulative CRC8 code for the given character
'---------------------------------------------------------------------------------------
'
Private Function XCalculateCRC8(CRC8 As Integer, Character As String) As Byte
Dim l_BitPopped As Boolean
Dim l_Bit As Byte
Dim l_Char As Integer

    l_Char = Asc(Character)
    For l_Bit = 0 To 7
        l_BitPopped = (CRC8 And &H80)
        CRC8 = CRC8 * 2
        If l_Char And &H80 Then
            CRC8 = CRC8 Or &H1
        Else
            CRC8 = CRC8 And &HFE
        End If
         
        If l_BitPopped Then
            CRC8 = CRC8 Xor &H85
        End If
        l_Char = l_Char * 2
    Next

    XCalculateCRC8 = CRC8 And &HFF
End Function

 

by: bandyt1712Posted on 2008-04-06 at 21:15:10ID: 21294321

Fill in the same string in both functions. If the results are equal, just use it.

 

by: CONTRACTOR4SITEPosted on 2008-04-07 at 00:02:58ID: 21294793

Thanks for the suggestion. I have tried this, but I don't seem to be able to get the solution. I think the two function s are doing slightly different things. For example, the VB code is using &H80 and &H1 and &HFE and &H85 as Hex constants whereas the C code seems to be using just &H8C and &H01.
I feel like I'm just hacking away! Clearly I'm out of my depth here - this is what happens when you give am SQL developer a 'proper programmers' job!!

 

by: bandyt1712Posted on 2008-04-07 at 11:26:21ID: 21299385

I think they have no shift operator (>>( in VB andy therefor they work around that wizk different constants.
Try to make a DLL in C and call the C function from VB with the same input as the VB function. Compare the results.

Making a C DLL and calling from VB you find here ...

http://support.microsoft.com/kb/106553

Hope that helps

Andy

 

by: CONTRACTOR4SITEPosted on 2008-04-07 at 11:29:42ID: 21299409

That sounds like a great idea, I'll look into this asap.
Thanks Andy

 

by: PaulCaswellPosted on 2008-04-07 at 11:40:23ID: 21299504

This might help:

unsigned char crc8(unsigned char crc; unsigned char data)
{
unsigned char i;
// XOR the passed crc with the data.
      crc = crc ^ data;
// 8 times
      for (i=0; i<8; i++){
// if crc is now odd
            if (crc & 0x01)
// odd -> crc = (crc / 2)  xor hex 8c
                  crc = (crc >> 1) ^ 0x8C
            else
// even -> crc = (crc / 2)
                  crc >>= 1;
      }      
      return crc;
}

Hopefully, some VB guru should be able to code this.

Paul

 

by: CONTRACTOR4SITEPosted on 2008-04-07 at 15:08:57ID: 21300998

Paul

This is great. I think I can make some progress based on this ...

Mike

 

by: CONTRACTOR4SITEPosted on 2008-04-08 at 00:45:53ID: 21303195

A colleague came up with this, which works perfectly:
Public Function checksum8(HexString As String) As String

        Dim buff(255) As Byte
        Dim CRC As Byte
        Dim x As Integer
        Dim y As Integer

        CRC = 255
       
        For x = 1 To Len(HexString) Step 2
       
            buff(x) = hex2dec(Mid$(HexString, x, 2))
           
            CRC = CRC Xor buff(x)
            For y = 1 To 8
                If CRC And 1 Then
                    CRC = CRC - 1
                    CRC = CRC / 2       '     Shift Right 1 bit
                    CRC = CRC Xor 140   '     0x8C
                Else
                    CRC = CRC / 2       '     Shift Right 1 bit
                End If
            Next y
        Next x
       
        checksum8 = CRC

End Function

Thanks to everyone who helped.

 

by: PaulCaswellPosted on 2008-04-08 at 10:31:35ID: 21307585

Thanks for the points.

I don't think you need:

                    CRC = CRC - 1

as it is odd at this point and you are just about to divide by 2 anyway.

Paul

 

by: CONTRACTOR4SITEPosted on 2008-04-08 at 12:47:24ID: 21308890

Hi Paul

Intersting point. I have tested it extensively and it works so I am reluctant to change it.
But I will bear your comment in mind should there be any further problems.
Thanks for the ongoing interest

Mike

 

by: PaulCaswellPosted on 2008-04-08 at 12:53:02ID: 21308935

Hi Mike,

If yours works reliably then this should too:

Public Function checksum8(HexString As String) As String

        Dim buff As Byte
        Dim CRC As Byte
        Dim x As Integer
        Dim y As Integer

        CRC = 255
       
        For x = 1 To Len(HexString) Step 2
       
            buff = hex2dec(Mid$(HexString, x, 2))
           
            CRC = CRC Xor buff
            For y = 1 To 8
                If CRC And 1 Then
                    CRC = CRC / 2       '     Shift Right 1 bit
                    CRC = CRC Xor 140   '     0x8C
                Else
                    CRC = CRC / 2       '     Shift Right 1 bit
                End If
            Next y
        Next x
       
        checksum8 = CRC

End Function

Note that you also don't need buff as an array as you only process it one byte at a time. Sorry to bang on but I just don't feel comfortable with code that is just 'space'.

Paul

 

by: CONTRACTOR4SITEPosted on 2008-04-08 at 12:57:58ID: 21308975

Now, that is an improvement. Can't argue with that. I will incorporate your version - interestingly I was concerned about the array, I didn't get it so I'm glad you've explained that it was redundant.
Mind you, if I have any problems you're now my Level 1 support! Hah!

 

by: CONTRACTOR4SITEPosted on 2008-04-08 at 13:05:42ID: 21309048

Paul
Thought you'd want to know. Buff doesn't need to be an array - as you rightly pointed out.
But removing the CRC = CRC -1 stopped it from working!
Re-instating this line restored functionality.
Interesting?!
Mike

 

by: PaulCaswellPosted on 2008-04-08 at 13:16:14ID: 21309140

>>But removing the CRC = CRC -1 stopped it from working!
Extraordinary!! I wonder why.

If CRC is odd then subtracting one and then dividing by two should have exactly the same effect as just dividing by 2 with integer types.

Perhaps VB recognises the bit loss and turns it into a float. Yukk!!! Glad I don't work in VB.

Paul
.

 

by: PaulCaswellPosted on 2008-04-08 at 13:35:03ID: 21309308

Cracked it!!

See Wikipedia on VB:

http://en.wikipedia.org/wiki/Visual_basic#Language_features

quote: ... Integers are automatically promoted to reals in expressions involving the normal division operator (/) so that division of an odd integer by an even integer produces the intuitively correct result. There is a specific integer divide operator (\) which does truncate.

So this should work using the '\' integer divide operator:

Public Function checksum8(HexString As String) As String

        Dim buff As Byte
        Dim CRC As Byte
        Dim x As Integer
        Dim y As Integer

        CRC = 255
       
        For x = 1 To Len(HexString) Step 2
       
            buff = hex2dec(Mid$(HexString, x, 2))
           
            CRC = CRC Xor buff
            For y = 1 To 8
                If CRC And 1 Then
                    CRC = CRC \ 2       '     Shift Right 1 bit
                    CRC = CRC Xor 140   '     0x8C
                Else
                    CRC = CRC \ 2       '     Shift Right 1 bit
                End If
            Next y
        Next x
       
        checksum8 = CRC

End Function



Paul

 

by: CONTRACTOR4SITEPosted on 2008-04-08 at 13:59:12ID: 21309556

I see you have the bit between your teeth.
Well, I'm off home (it's 10 PM here) but I promise to try this version when I'm back in the office on Thursday. You'll be the first to know! Thanks for your continuing interest.
M

 

by: PaulCaswellPosted on 2008-04-08 at 14:05:22ID: 21309601

10:00 pm here too. ;-) Haven't you got a home to go to. !!! :)

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...