Posts: 13
Threads: 3
Joined: May 2017
Hello everyone! So far I have always programmed with visual basic, but I happened to have to convert my code into python. I would need if somebody can convert this function from vb to python (2.7):
Sub Modbus_CRC(strInput As String) As String
Dim RetCRC As String
Dim RetStr As String
Dim CRCREG As Int
Dim MVAL As Int
Dim R As Short
Dim I As Short
Dim A As Int
Dim B As Int
CRCREG = 0xFFFF
For R = 0 To strInput.Length - 1 Step 2
RetStr = strInput.SubString2(R, R + 2)
MVAL = Bit.ParseInt(RetStr, 16)
CRCREG = Bit.Xor(CRCREG, MVAL)
CRCREG = Bit.And(CRCREG, 0xFFFF)
For I = 1 To 8 Step 1
If Bit.And(CRCREG, 0x01) = 1 Then
CRCREG = Bit.Xor(Bit.UnsignedShiftRight(CRCREG, 1), 0xA001)
CRCREG = Bit.And(CRCREG, 0xFFFF)
Else
CRCREG = Bit.UnsignedShiftRight(CRCREG, 1)
CRCREG = Bit.And(CRCREG, 0xFFFF)
End If
Next
Next
A = Bit.And(CRCREG, 0xFF)
B = Bit.And(CRCREG, 0xFF00)
A = A * 256
B = B / 256
If (A + B) < 16 Then
RetCRC = "000" & (A + B)
Else If (A + B) < 256 Then
RetCRC = "00" & Bit.ToHexString(A + B)
Else If (A + B) < 4096 Then
RetCRC = "0" & Bit.ToHexString(A + B)
Else
RetCRC = Bit.ToHexString(A + B)
End If
Return RetCRC.ToUpperCase
End Sub If someone can do it, thanks in advance!!!
Posts: 2,342
Threads: 62
Joined: Sep 2016
You're probably going to have a hard time getting someone to do that for you. If you give it a try, we'd be enthusiastic to help you learn Python, though. You'll get the best result if you keep snippets (especially of non-Python) to 5-10 lines tops.
Posts: 13
Threads: 3
Joined: May 2017
May-18-2017, 03:06 PM
(This post was last modified: May-18-2017, 03:07 PM by Bokka.)
(May-18-2017, 03:03 PM)micseydel Wrote: You're probably going to have a hard time getting someone to do that for you. If you give it a try, we'd be enthusiastic to help you learn Python, though. You'll get the best result if you keep snippets (especially of non-Python) to 5-10 lines tops.
Thanks for the reply! But I can't find the button for edit my post now....
Posts: 2,342
Threads: 62
Joined: Sep 2016
There's no need to edit your post, just add a new one to this thread with your Python questions :)
Posts: 13
Threads: 3
Joined: May 2017
May-22-2017, 08:22 AM
(This post was last modified: May-22-2017, 12:05 PM by buran.)
I have that code, but I get a generic "Syntax error", I can't understand where I wrong...
def calc(data):
crc_table=[0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,0xC601,0x06C0,0x0780,0xC741,0x0500,0xC5C1,0xC481,0x0440,0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,0x1A40,0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641,0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040,0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40,0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640,0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240,0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441,0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,0xAA01,0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840,0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,0xB681,0x7640,0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241,0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440,0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641,0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x4040]
crc_hi=0xFF
crc_lo=0xFF
for w in data:
index=crc_lo ^ ord(w)
crc_val=crc_table[index]
crc_temp=crc_val/256
crc_val_low=crc_val-(crc_temp*256)
crc_lo=crc_val_low ^ crc_hi
crc_hi=crc_temp
crc=crc_hi*256 +crc_lo
print (crc)
return crc
Posts: 4,220
Threads: 97
Joined: Sep 2016
I'm not getting a syntax error. I am getting a type error, but that may be because I don't understand what your data looks like.
Please rerun it with a small set of data. Then show use the data you used, and the complete error message you get.
Posts: 13
Threads: 3
Joined: May 2017
May-23-2017, 07:46 AM
(This post was last modified: May-23-2017, 07:46 AM by Bokka.)
(May-22-2017, 11:59 AM)ichabod801 Wrote: I'm not getting a syntax error. I am getting a type error, but that may be because I don't understand what your data looks like.
Please rerun it with a small set of data. Then show use the data you used, and the complete error message you get.
I need to create a function for calculate the CRC16 of a string.
For example, for the string:
11 01 00 03 00 0C
The CRC calculated must be
CE9F (CE High, 9F Low)
And for the string
11 01 02 CD 0B
The result of the CRC must be
6D 68
I'm trying to make some steps, but I am far away from the results....
This is what I do in python:
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> def calc(data):
crc_table=[0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,0xC601,0x06C0,0x0780,0xC741,0x0500,0xC5C1,0xC481,0x0440,0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,0x1A40,0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641,0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040,0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40,0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640,0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240,0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441,0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,0xAA01,0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840,0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,0xB681,0x7640,0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241,0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440,0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641,0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x4040]
crc_hi=0xFF
crc_lo=0xFF
for w in data:
index=crc_lo ^ ord(w)
crc_val=crc_table[index]
crc_temp=crc_val/256
crc_val_low=crc_val - (crc_temp * 256)
crc_lo = crc_val_low ^ crc_hi
crc_hi = crc_temp
crc=crc_hi*256 + crc_lo
return crc
>>> calc (11010003000C)
SyntaxError: invalid syntax
>>> calc
<function calc at 0x02F02C70>
>>> calc 11 01 00 03 00 0C
SyntaxError: invalid syntax
>>>
Posts: 8,168
Threads: 160
Joined: Sep 2016
do you NEED to write your own function? why not check available packages on PyPi. It look like at least 3 packages provide crc16 implementation
Posts: 13
Threads: 3
Joined: May 2017
(May-23-2017, 07:49 AM)buran Wrote: do you NEED to write your own function? why not check available packages on PyPi. It look like at least 3 packages provide crc16 implementation
Yes, I prefer to have a function writed by me
Posts: 8,168
Threads: 160
Joined: Sep 2016
if you call it like this
calc ('11010003000C') your function returns '3601'
One of the packages I testes - PyCRC calculates it as 3191
>>> from PyCRC.CRC16 import CRC16
>>> print CRC16().calculate('11010003000C')
3191
>>> both not what you expect
CE9F
|