Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python value error

Sivun loppuun

Macro [29.06.2010 17:22:08]

#

Terve

Jatkoin projektiani taas sairasloman jälkeen, ja nyt saan virhettä:

ValueError: invalid literal for int() with base 10: '\\x00\\x00\\x00\\x00... (jne)'

Koitan lähettää numeroita, mutta Python 3. versiossa datan pitää olla bitteinä tai bufferina (Häh?). Kun muutan numeroarvon (Nyt 255) biteiks, saan yllä olevan mössön tulokseksi. Miten voin lähettää numeroita sokketeilla?

pake10 [29.06.2010 17:26:03]

#

Jos lähettäisit koodisi, olisi vähän helpompi selvittää ongelmaa, tuosta tulosteesta kun ei paljoa näe.

Macro [29.06.2010 17:46:17]

#

No ei siinä muuta ole, kuin socket.send(bytes(255)). Asiakas vastaanottaa sen socket.recv(1024).

Metabolix [29.06.2010 17:53:19]

#

Muistahan nyt ensiksi, että bitti (bit) on aivan eri asia kuin tavu (byte). Katso vaikka Wikipediasta, jos et vielä tiedä.

Nyt koodisi lähettää tyhjän, 255 tavua pitkän taulukollisen tavuja. Oikea tapa tekstin lähettämiseen olisi tehdä ensin se teksti ja enkoodata se sitten tavuiksi, kuten oppaassa Pythonin merkistöistä kerrotaan. Kannattaa lukea koko opas, huomaa myös lisäys Python 3:sta.

Macro [29.06.2010 18:56:58]

#

Joo, noi menee sillon tällön sekasin, bitit ja tavut nimittäin. Nyt data lähtee. Mutta, miten voisin lukea dataa vain sen verran kuin sitä tulee? Jos lopetusmerkki on vaikka |, niin miten siihen asti voi lukea dataa? Nyt tulee päällekkäisyyksiä, kuten toisessa aiheessa sanoin.

Eli siis luetaan aina yksi merkki lisää, kunnes tulee |.

Metabolix [29.06.2010 19:06:34]

#

Vaihtoehtoja on kaksi: joko voit kirjata datan alkuun, miten pitkä pala tulee, tai voit lukea tavu kerrallaan ja lisätä saadun datan aina vanhan perään, kunnes löytyy lopetuskohta. TCP-yhteyden kohdalla suosittelen tavoista ensimmäistä. Pituusilmoituksen on tietenkin parasta olla vakiomittainen, esimerkiksi alle 256 tavun paketeille yksi tavu riittää kertomaan pituuden.

jalski [29.06.2010 19:18:46]

#

Metabolixin mainitsemista tavoista toisen kerroin jo aiemmin toisessa viestiketjussa.

Jos lähetät merkkijonoja (esim. chat-ohjelma), niin tavu kerrallaan lukeminen on ihan ok ja merkkijonon lopetusmerkkinä kannattaa käyttää CRLF:ää tai pelkkää LF:ää. Muuhun siirtoon Metabolixin mainitsema tapa 1 on yleensä parempi vaihtoehto.

Macro [29.06.2010 19:42:51]

#

Koitin tätä, mutta ei toiminut.

maara = 1
while True:
    data = asiakas.recv(maara)
    data = data.replace("b\'", "") # Koska bytes() lisää tommoiset
    data = data.replace("\'", "") # Koska bytes() lisää tommoiset

    if data:
        if data[maara] != "|":
            maara = maara + 1
    else:
        print(data)
        break

Esimerkiksi datalla b'AskingCurrentVolume|' se jää vain pyörimään tuohon while silmukkaan, kun ei löydy tuota | -merkkiä. Vai, palauttaako data[maara] kaikki merkit maara-kohtaan asti?

Metabolix [29.06.2010 20:04:50]

#

Macro kirjoitti:

Koska bytes() lisää tommoiset

Bytes ei suinkaan lisää mitään, vaan bytes-muotoista dataa ruudulle tulostettaessa siihen lisätään tuollaiset, aivan kuten pitkiin lukuihin lisätään loppuun L-kirjain.

Jos nyt vähän mietit koodiasi, niin eihän tuossa ole mitään järkeä. Haet ensin yhden tavun, sitten seuraavat kaksi tavua, sitten seuraavat kolme tavua ja niin edelleen. Jos siirrettävä data on vaikka "abcdefg|", ensimmäisellä kierroksella saat tavut "a", toisella kierroksella "bc", kolmannella "def" ja niin edelleen.

Onko tosiaan niin vaikea lukea kirjaimellisesti, mitä on neuvottu? "Voit lukea tavu kerrallaan ja lisätä saadun datan aina vanhan perään, kunnes löytyy lopetuskohta."

data = b''
lopetus = b'|'
while True:
  tavu = asiakas.recv(1)
  if tavu == lopetus:
    break
  else:
    data = data + tavu

jalski [29.06.2010 20:09:12]

#

Katsopas tuota silmukkaasi hiukan tarkemmin ajatuksella: miksi vastaanotat aina maara verran tavuja? Pitäisiköhän aina vastaanottaa yksi tavu eikä maara verran tavuja? Pitäisikö maara muuttujaa käyttää vain viimeisen alkion indeksin laskurina? ...

Macro [29.06.2010 20:39:46]

#

Joohei, joskus se lukeminen onkin vaikeaa. :D Joo, mutta kiitos. :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta