Python: Generating checksum

Do you have questions about writing plugins or scripts in Python? Meet the coders here.
Post Reply
User avatar
Fiasco
Plugin Developer
Posts: 222
Joined: Fri Jul 24, 2009 5:32 am
Location: St. Louis MO
Contact:

Python: Generating checksum

Post by Fiasco » Thu Nov 26, 2009 1:00 am

For Mitsu TV's, a checksum ends every command.

Any tips on generating this checksum in Python?

If the command is
DF 80 70 F8 02 00 00

The checksum is the sum of the above (2C9). take the low byte (C9) convert to binary and do ones compliment then return to hex (36H)

This formula (so to speak) for generating the mitsu checksum was posted by Audible Solutions here

User avatar
Fiasco
Plugin Developer
Posts: 222
Joined: Fri Jul 24, 2009 5:32 am
Location: St. Louis MO
Contact:

Re: Python: Generating checksum

Post by Fiasco » Thu Nov 26, 2009 3:48 am

This is what I have so far

Code: Select all

        data = "DF8070F8020000"
        pairs = []
        for i in range(0,len(data),2):
            pairs.append(data[i:i+2])               
        value = 0
        for i in pairs:
            value = value + int(i,16)
        value = hex(value)
        value = (int(value,16) & int('ff',16)) 
        # at this point the value is C9
        value = hex(value)
        value = (int(value,16) ^ int('11111111',2))
        # value is now 36
        value = binascii.a2b_hex(data) + hex(value)
        self.plugin.serialThread.Write(value)
Is this right?
Now, how do I do one's compliment on C9 to get the final value (0x36)?

This is for the Mitsu LT249 plugin found here

RS232 docs and plugin available in that thread.

User avatar
jinxdone
Plugin Developer
Posts: 443
Joined: Tue Jan 02, 2007 4:08 pm

Re: Python: Generating checksum

Post by jinxdone » Thu Nov 26, 2009 8:40 am

That looks about right to me Fiasco. Here's another way of doing pretty much the same thing.

- The string.decode("hex") converts the string so that it's the same as if you had input it as "\xDF\x80\x70\xF8\x02\x00\x00", so now we can loop through it easily one character at a time.
- Looping through the string use ord(byte) to get the value of the character as an integer, so we can sum it up.
- After we have the sum then get the low byte by doing a bitwise AND against value 0xFF.
- To get the one's complement invert the bits, which you can do with bitwise XOR against value 0xFF.
- Finally append our checksum byte to the string.

Code: Select all

data = "DF8070F8020000".decode("hex")
sum = 0
for byte in data:
    sum += ord(byte)
data += chr((sum & 0xFF) ^ 0xFF)

# Here's how to get the one's complement of the low byte of the sum
print "Sum:", sum, "=", hex(sum)
print "Low byte:", hex(sum & 0xFF)
print "One's complement:", hex((sum & 0xFF) ^ 0xFF)
-jinxdone

User avatar
Fiasco
Plugin Developer
Posts: 222
Joined: Fri Jul 24, 2009 5:32 am
Location: St. Louis MO
Contact:

Re: Python: Generating checksum

Post by Fiasco » Thu Nov 26, 2009 7:59 pm

Thanks Jinx. I knew there would be a much quicker/simpler way to go about doing it.

I am going to have to find some time to squeeze a python book or two in.

User avatar
Fiasco
Plugin Developer
Posts: 222
Joined: Fri Jul 24, 2009 5:32 am
Location: St. Louis MO
Contact:

Re: Python: Generating checksum

Post by Fiasco » Fri Nov 27, 2009 6:38 am

How do I do a two's complement?

I'm doing the same thing but for samsung tv's now.

User avatar
Fiasco
Plugin Developer
Posts: 222
Joined: Fri Jul 24, 2009 5:32 am
Location: St. Louis MO
Contact:

Re: Python: Generating checksum

Post by Fiasco » Fri Nov 27, 2009 7:35 am

Code: Select all

    data = value.decode("hex")
    sum = 0
    for byte in data:
        sum += ord(byte)
    print "Two's complement:", hex((~sum + 1) & 0xFF)

    return hex((~sum + 1) & 0xFF)
[/code]

That gave me the right checksum anway for two's compliment of he sum of the command.

Post Reply