Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[python] string to integer

Pagina: 1
Acties:

  • kinderpindakaas
  • Registratie: Oktober 2006
  • Laatst online: 12-03-2024
Ik ben al een aantal dagen bezig om een lullig foutje te ontdekken in mijn python code.
De python code word geschreven voor de 1.5.2+ interpeter, dus ik heb niet de beschikking over de aller nieuwste functies van python. De code word gedraaid op een Telit GPRS module, die geen debug mogelijkheden heeft. Gaat er iets fout, dan loopt hij gewoon vast.
Doordat ik steeds wat steekwoorden naar terminal stuur, weet ik ongeveer waar de fout zit.

Ik heb een functie geschreven die CRC berekend over een binnenkomende string.

code:
1
2
3
4
5
6
7
def calculatecrc( message="" ):
    remainder = 0
    data = 0
    for c in message:
        data = ord(c) ^ remainder
        remainder = arr[data] ^ (remainder << 8)
    SER.send(str(remainder) + '\r\n')


Om de CRC berekening sneller te maken, heb ik gebruik gemaakt van een tabel die reeds gevuld is met restwaardes voor elke mogelijke byte. Maar dit is niet echt van belang.

Wanneer ik de regel data = ord(c) ^ remainder voorzie van een # ervoor (zodat het dus commentaar word), dan gaat de code wel vrolijk er doorheen.
Ik ben ten einde raad, weet echt niet hoe ik dit moet oplossen.
C bevat telkens een karakter uit de string, die zet ik om naar een integer en dan kan ik XOR uitvoeren. Ik ben nog niet zeker of ord() in deze interpeter versie ondersteund word

  • Marcj
  • Registratie: November 2000
  • Laatst online: 11:06
Gokje: de array is te klein. Hoe groot heb je deze gemaakt?

  • kinderpindakaas
  • Registratie: Oktober 2006
  • Laatst online: 12-03-2024
array loopt van 0 tot 256. Dus is gevuld met de rest waarde van alle mogelijke bytes.
Dit heb ik gedaan om de snelheid van het berekenen van de CRC te bevorderen.

Ik ben net tot conclusie gekomen dat data een 16bit integer wordt, die ik ook nog eens 8x naar links schuif. Dus die word vele malen groter dan 256.

Dit moet wel op te lossen zijn met een 0x00FF masker erover heen te leggen

[ Voor 11% gewijzigd door kinderpindakaas op 27-09-2007 11:54 ]


  • writser
  • Registratie: Mei 2000
  • Laatst online: 28-11 15:44
Ten eerste: waarom het wiel overnieuw uitvinden? Hier is een python projectje dat het CRC-algoritme al heeft geimplementeerd: http://sourceforge.net/projects/crcmod/ . Check crcmod-1.4/crcmod/crcmod.py, daar staat alle code in die je nodig hebt.

Ook zit er in zlib al een ingebouwde CRC-calculator, maar ik kan me voorstellen dat je die niet kan gebruiken op je telefoon. Wat voor fouten krijg je te zien als je de code draait in de gewone interpreter op je pc?

Als ik hier wat pruts wordt data al snel veel te groot. Waarschijnlijk omdat de xor-operator de kleinste string automatisch aanvult met nul-bitjes. Dit werkt wel bij mij:

data = (ord(c) ^ remainder) & 255

Onvoorstelbaar!


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11:52
Hoe kom je aan deze CRC code? Zelf bedacht, of ergens van overgenomen?

Het is namelijk een heel gebruikelijke manier om CRC's te berekenen, maar het is dan gebruikelijk om de andere kant op te shiften:
Python:
1
2
3
    remainder = 0
    for c in message:
        remainder = arr[(ord(c) ^ remainder)&0xff] ^ (remainder >> 8)

(Moet je wel je table op een consistente manier genereren. Sowieso lijkt het me handig om eerst te testen zonder lookup table.) Je kunt het ook wel omgekeerd doen, maar dan wordt remainder steeds groter (logisch, je shift steeds verder naar links) en heb je op het eind een heleboel nullen aan de rechterkant staan, en moet je je mask meeschuiven. Nu shift je juist die nullen er steeds uit.
Ik ben nog niet zeker of ord() in deze interpeter versie ondersteund word.
Ik zou dan maar snel lokaal eenzelfde versie van de interpreter installeren, als je een beetje betrouwbaar wil kunnen debuggen.

[ Voor 17% gewijzigd door Soultaker op 27-09-2007 18:09 ]